我已经创建了一个'configure'infix operator'=>'它允许我内联配置对象,允许我在赋值级别定义和初始化属性和/或调用方法/函数。
例如,而不是这个,它需要一个初始值设定项。。。
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语言中,您可以通过简单地扩展“object”来扩展所有内容,因为这是所有内容的基础(讽刺的是,包括值类型),但Swift中似乎没有类似的内容。
是有,还是我必须一直手动添加这些一致性?