У меня есть много разных классов, которым нужен доступ к одному и тому же объекту GKMatch, и я опасаюсь, как часто мне нужно передавать эту ссылку GKMatch. Я хочу найти способ, которым любой класс может надежно получить один и тот же экземпляр GKMatch.

Я предлагаю сделать это косвенно через GKMatchDelegate, например:

extension GKMatchDelegate {
    static func sharedGKMatch ()->GKMatch? { return nil }
}

Затем в моем подклассе GKMatchDelegate я создал бы переменную currentMatch: GKMatch? и переопределил бы функцию, чтобы вернуть ее.

Когда я попытался протестировать концепцию на игровой площадке, я сделал следующее:

class SingletonTest {}

extension SingletonTest {
  static func shared ()->SingletonTest? { return nil }
}

class SubclassOfSingletonTest: SingletonTest {
  static var sharedTest: SingletonTest?
  override static func shared()->SingletonTest? {
    return sharedTest
  }
}

И получил сообщение об ошибке «Объявления от расширений пока не могут быть отменены». Судя по «пока», я предполагаю, что они над этим работают. А пока есть другой способ добиться того же результата?

0
Le Mot Juiced 26 Окт 2015 в 23:48

2 ответа

Лучший ответ

Я предполагаю, что вам нужен только один общий GKMatch, а не GKMatch для каждого подкласса GKMatchDelegate. В первом случае, я думаю, вы слишком много думаете об этом. Просто имейте общедоступную переменную, которая является синглтоном не в каком-либо классе.

public var sharedGKMatch: GKMatch = GKMatch()

Если вы хотите сделать его только для чтения

public let sharedGKMatch - GKMatch()

Это класс, поэтому содержимое GKMatch по-прежнему может изменяться.

1
JeremyP 27 Окт 2015 в 13:08

Большинство приложений имеют своего рода модель данных - объект или группу объектов, в которых хранится вся информация, необходимая приложению для того, чтобы делать то, что оно делает. Для текстового процессора, например, модель данных может быть набором открытых документов вместе с любой глобальной конфигурационной информацией (информация о принтере, шрифты, настройки и т. Д.). Для игры модель содержит текущее состояние игры - состояние доски, текущее местоположение и скорость плохих парней, количество собранных золотых монет и т. Д.

В вашем приложении также должна быть модель данных, и похоже, что текущий экземпляр GKMatch должен быть включен в эту модель. Таким образом, любой класс, имеющий доступ к модели, автоматически получает доступ к GKMatch, что означает, что у вас есть только одна вещь, которую вам нужно передать. Это почти наверняка лучший подход, чем добавление интерфейса общих объектов к чьему-то классу.

1
Caleb 27 Окт 2015 в 13:18