Я нашел одно исключение, где мне действительно нравится переменная сеттера, которая является, когда я пропускаю замыкание как единственный параметр в мето d с единственной целью сохранить его для последующего исполнения.
я реализую его как метод следующим образом:
typealias ThemeSetter =() ->()
class Theme {
fileprivate var themeSetters:[ThemeSetter] = []
class var shared: Theme {
struct Singleton {
static let instance = Theme()
}
return Singleton.instance
}
...
func setColor(_ entry:@escaping ThemeSetter) {
entry()
themeSetters.append(entry)
}
}
я могу вызвать метод следующим образом:
Theme.shared.setColor({
self.navigationBar.barTintColor = Theme.shared.gameBarTint
})
Но я не люблю близкие paretheses после закрывающей скобки, так как У меня может быть много строк в закрытии.
Итак, зная о Trailing Closures я могу просто изменить код, чтобы выглядеть следующим образом:
Theme.shared.setColor() {
self.navigationBar.barTintColor = Theme.shared.gameBarTint
}
Это совершенно нормально, и синтаксис, что Apple, показывает для Trailing Closures. Поскольку существует только один параметр, являющийся минимализма, что я не побоюсь сделать код еще более компактной и снизить его к этому:
Theme.shared.setColor {
self.navigationBar.barTintColor = Theme.shared.gameBarTint
}
Который раз, как Apple, показывает сделать трейлинг Closures; Кроме того, этот способ обычно используется для какого-то Предиката, где закрытие используется, чтобы сообщить методу, как сделать сортировку, или когда закрытие используется в конце вызова асинхронной функции как закрытие завершения. Я хочу назначить закрытие ... Что-то.
Если я заменю метод SetColor с переменной выглядит следующим образом:
var setColor:ThemeSetter? {
didSet {
if setColor != nil {
setColor?()
themeSetters.append(setColor!)
setColor = nil
}
}
}
Теперь вызов выглядит следующим образом:
Theme.shared.setColor = {
self.navigationBar.barTintColor = Theme.shared.gameBarTint
}
Это знак равенства означает, что вся разница будет. Это показывает, что я назначаю закрытие и не запускаю какую-либо функцию, которая использует закрытие, хотя это и происходит. : ') < - нужен смайлик здесь.
Заключительные примечания: Это действительно не имеет ничего общего с закрытием, оно просто показывает, как вы можете сделать сеттер только переменной, за исключением того, что он все равно возвращает нуль. Он не предназначен для защиты класса от доступа пользователя к переменной для чтения, как только настоящий сеттер. Кроме того, прощайте учебник по трейлинг-закрытию и синглтонам.
Возможно, я не могу получить достаточное количество голосов, чтобы быть правильным ответом, но почему правильный ответ: «Нет, вы не можете! Вы должны использовать вызов метода!». Я говорю «Ni», которому нужен весь этот синтаксис. Просто используйте переменную и не читайте ее, или если вы это сделаете, не возвращайте ее. вроде как ответ Рудольфа Адамковича, который получил 0 голосов.
Неа - звучит, как вы бы лучше с помощью метода. –
Хм, я полагаю, это ОДНА вещь, которую я буду ненавидеть о быстром! – Aggressor
Когда вы используете свойства только для записи? Мне никогда не приходилось это делать. –