Я хочу украсить UIViewController с возможностью настройки его интерфейса, когда метод setInteractionEnabled
вызывается из другого класса (например, Network State Manager). Все изменения (если они есть) должны быть указаны в конкретном контроллере путем переопределения onInteractionChanged
. Вот мой код:Быстрое закрытие в расширении протокола
import Foundation
typealias InteractionClosure = ((enabled: Bool) -> Void)
protocol Interaction: class {
var onInteractionChanged: InteractionClosure? { get set }
func setInteractionEnabled(enabled: Bool)
}
extension Interaction where Self: UIViewController {
// Default: Do nothing
// Throws: - Extensions may not contain stored properties
var onInteractionChanged: InteractionClosure? = nil
func setInteractionEnabled(enabled: Bool) {
onInteractionChanged?(enabled: enabled)
}
}
extension UIViewController : Interaction {}
Как добавить реализацию по умолчанию для onInteractionChanged
?
Ошибка говорит об этом - расширения не могут содержать сохраненные свойства. Вы должны сделать это вычисляемым свойством, которое просто возвращает 'nil' при доступе. Хотя в протоколе необходимо обеспечить установленную способность свойства '{get set}'? В противном случае вам придется иметь пустой сеттер для реализации свойства по умолчанию. Я хотел бы сделать свойство '{get}' и дать соответствующим типам выбор того, хотят ли они просто переопределить его с помощью рассчитанного свойства (только для получения) или использовать сохраненное свойство (gettable и устанавливаемый). – Hamish