Swift Xcode获取&lt; <error type =“”>&gt;来自封闭

时间:2018-03-10 15:15:28

标签: ios swift xcode generics types

Swift创建红色按钮的方法:

let button: UIButton = {
      let button = UIButton()
      button.backgroundColor = .red
      return button
}()

通过我的扩展(kotlin的方法):

let button: UIButton = UIButton().apply(){ this in
    this.backgroundColor = UIColor.red
}

我的扩展有两个问题,第一个是Xcode无法识别闭包参数“this”,它显示&lt;&lt;错误类型&gt;&gt;,所以我没有自动完成(虽然它正在工作),第二个是我希望能够推断泛型类型,因为我已经在实例化它。

扩展名:

extension NSObject {
    func apply<T>(_ closure: (T) -> ()) -> T {
        let this = self as! T
        closure(this)
        return this
    }
}

我希望有人能为此找到解决方案。提前谢谢。

2 个答案:

答案 0 :(得分:1)

这里的问题是Swift无法推断出T的类型。你没有,也不能告诉Swift使用当前类型作为闭包的类型。 Self仅适用于类中方法的结果类型。

您可以这样做:

func apply<T>(_ obj: T, closure: (T) -> Void) -> T {
    closure(obj)
    return obj
}
apply(UIButton()) { this in this.backgroundColor = .red }

但我不认为这就是你想要的。您希望单词apply位于中间,对吗?

不幸的是,我无法想到你将如何实现这一目标。作为替代方案,您可以尝试更换单词&#34; apply&#34;与运营商。例如,我认为-->非常适合这种情况。

infix operator -->

func --> <T>(obj: T, closure: (T) -> Void) -> T {
    closure(obj)
    return obj
}
let button = UIButton() --> { this in this.backgroundColor = .red }

答案 1 :(得分:0)

我不确定为什么它不适合你。如果扩展名在类中,则将其放在类之外,这样它就可以独立完成。如果已经尝试使用命令(命令+ k)清除错误,则会重新加载它们。如果错误仍然存​​在,那将非常令人困惑,因为它对我来说很好。