我创建了一个通用扩展函数来执行apply
函数中的任何内容。我的问题是我需要在所有应用调用中显式转换$0 as UILabel
(除了链中的最后一个)以避免此编译错误:“表达式类型不明确而没有更多上下文”。我觉得应用扩展功能可以让我在每次应用调用中使用$ 0而无需显式转换,但我看不到。
我的最终目标是使用apply函数来避免在流畅的链范围之外添加局部变量(在本例中为UILabel)。
extension NSObject {
func apply<T>(applyFunc: (T)->()) -> T {
applyFunc(self as! T)
return self as! T
}
}
class Test {
func test() -> UILabel {
return UILabel()
// Error with this-> .apply{ $0.text = "Hello" }
.apply{ ($0 as UILabel).text = "Hello" }
.apply{ $0.textColor=UIColor.blueColor() }
}
}
修改
我最终得到了github.com/devxoul/Then/blob/master/Sources/Then.swift启发的解决方案。只有协议才能在扩展中使用Self。
public protocol Apply {}
extension Apply {
public func apply(applyFunc: Self -> Void) -> Self {
applyFunc(self)
return self
}
}
extension NSObject: Apply {}