Протокол определения синглтона со свойствами - PullRequest
0 голосов
/ 13 июня 2018

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

protocol SingletonProtocol {
    static var shared: SingletonProtocol { get }
    var variable : Int { get set }
}

И следующий класс, который реализует этот протокол:

class Singleton : SingletonProtocol{
    static let shared : SingletonProtocol = Singleton()
    var variable = 4
}

Если я вызываю:

Singleton.shared.variable = 5

Я получаю следующую ошибку:

 change 'let' to 'var' to make it mutable

Если я реализую этот класс без протокола, я не получу ошибку, и переменная может быть изменена.Я могу решить эту проблему, добавив setVariable: метод, но я хочу получить доступ и изменить переменную напрямую.

Как мне написать протокол, который определяет синглтон с переменными, которые могут быть изменены?

Ответы [ 3 ]

0 голосов
/ 13 июня 2018

В вашем синглтон-классе измените объявление переменной с let на var.так что это будет так же, как в объявлении протокола.

class Singleton : SingletonProtocol{
    static var shared : SingletonProtocol = Singleton()
    var variable = 4
}

РЕДАКТИРОВАТЬ:

также добавить только getter для sharedInstance в объявлении протокола, чтобы служить цели класса singleton как:

protocol SingletonProtocol: AnyObject {
    static var shared: SingletonProtocol { get }
    var variable: Int { get set }
}
0 голосов
/ 13 июня 2018

Сделать протокол доступным только для классов (struct не сможет соответствовать этому протоколу):

protocol SingletonProtocol: AnyObject {
    static var shared: SingletonProtocol { get }
    var variable: Int { get set }
}

Теперь вы можете установить свойство shared как let

class Singleton: SingletonProtocol {
    static let shared: SingletonProtocol = Singleton()
    var variable: Int = 0
}
0 голосов
/ 13 июня 2018

Изменить

static let shared : SingletonProtocol = Singleton()

на

static var shared : SingletonProtocol = Singleton()
private init() {} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...