Как определить синглтон в Swift - PullRequest
0 голосов
/ 10 марта 2020

Я определяю синглтон с помощью этого кода:

class MySingleton {

    static let instance = MySingleton()

    private init() {}

    func example(myParameter:String) {

    }
}

Что, кажется, работает нормально, поскольку я могу правильно выполнить следующий вызов:

MySingleton.instance.example(myParameter:"a string")

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

MySingleton.example(self: MySingleton.instance)

Я знаю, что определил свойство stati c для создания Singleton, но функция example не является stati c, так почему я могу вызвать его от уровня класса? Также обратите внимание на параметр этого второго вызова, он не получает параметр String, определенный в функции, но self типа MySingleton.

Как я уже видел, этого не произойдет, если функция определена как приватная, но, очевидно, она мне нужна publi c для правильного использования, так что я неправильно определяю?

1 Ответ

0 голосов
/ 11 марта 2020

Хотя уже было сказано, что на этот вопрос уже дан ответ в SO, я думаю, что есть некоторые отличия, которые делают этот вопрос уникальным, и именно поэтому я собираюсь ответить на него.

Моя реализация Singleton абсолютно верна, и проблема, которая касалась меня, описана, как сказал Мартин Р. в комментариях здесь . Он известен как «Curried» Функции, так как эта ссылка расскажет вам гораздо больше, чем я.

Что касается синглетонов, то, насколько я обнаружил, нет способа скрыть эти «классовые» методы. , Тем не менее, это также правда, что мы не должны сильно беспокоиться об этом, так как некоторые официальные классы (те, что сделаны Apple), которые используют синглтоны, также демонстрируют такое же поведение. Здесь у нас есть несколько примеров на случай, если вы захотите проверить:

  • UserDefaults.standard
  • FileManager.default
  • URLSession.shared
  • OperationQueue. main
  • UIApplication.shared

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

...