流畅的通用扩展函数中的Swift模糊类型

时间:2016-01-12 21:14:56

标签: swift generics fluent

我创建了一个通用扩展函数来执行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 {}

0 个答案:

没有答案