Я создал инфиксный оператор configure '=>', который позволяет мне конфигурировать встроенные объекты, позволяя мне как определять, так и инициализировать свойства и / или вызывать методы / функции на уровне назначения.
Например, вместо этого, который требует инициализатора ...
let redSquare = SquareView()
init(){ // Some init somewhere
redSquare.backgroundColor = .red
}
Я могу просто сделать это ...
let redSquare = SquareView() => { $0.backgroundColor = .red }
Оператор 'configure' реализован следующим образом...
infix operator =>
public protocol Configurable {}
extension Configurable {
public typealias ConfigureDelegate = (Self) -> Void
@discardableResult
public static func => (this:Self, _ delegate:ConfigureDelegate) -> Self {
delegate(this)
return this
}
}
extension NSObject : Configurable {}
Примечание. Вы также можете реализовать это как функцию-член, как показано ниже, но я предпочитаю инфиксный оператор, поскольку он не загромождает.(точка) завершение.
public protocol Configurable {}
extension Configurable {
public typealias ConfigureDelegate = (Self) -> Void
@discardableResult
public func configure(delegate:ConfigureDelegate) -> Self {
delegate(self)
return self
}
}
extension NSObject : Configurable {}
Как вы можете видеть, я уже заставляю NSObject соответствовать этому протоколу, но реально это должно быть в состоянии использовать все, что нужно для установки свойств, которые не были переданы.через инициализатор или все, что требует вызова метода / функции как части его инициализации.
В настоящее время это означает, что мне просто нужно продолжать добавлять это везде (для элементов, не основанных на NSObject) ...
extension MyStruct : Configurable {}
extension MyClass : Configurable {}
extension MyOtherClass : Configurable {}
Этот недопустим (что меня действительно раздражает!)
extension AnyObject : Configurable {}
Например, в C # вы можете расширить все, просто расширив объект, так как это основадля всего (по иронии судьбы, включая типы значений), но в Swift нет ничего похожего.
Есть, или мне просто нужно вручную добавлять эти соответствия?