【问题标题】:Swift Xcode getting <<error type>> from generic type parameter inside closureSwift Xcode 从闭包内的泛型类型参数中获取 <<error type>>
【发布时间】:2018-08-19 00:31:22
【问题描述】:

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”,它显示>,所以我没有自动完成(虽然它正在工作),并且第二个是我希望能够推断出泛型类型,因为我已经在实例化它了。

扩展名:

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

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

【问题讨论】:

    标签: ios swift xcode generics types


    【解决方案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这个词在中间,对吧?

    不幸的是,我想不出你将如何实现这一目标。作为替代方案,您可以尝试将“应用”一词替换为运算符。比如我觉得--&gt;就很适合这个。

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

    【讨论】:

    • 你的第二种方法让我大吃一惊,我已经习惯了java,在iOS/Swift中开发了一个星期,我什至不知道你可以使用这样的运算符,谢谢.
    【解决方案2】:

    我不确定为什么它不适合你。如果扩展在类内,则将其放在类外,因此它是独立的。如果这就是它已经尝试使用命令(command + k)清除错误的方式,这将重新加载它们。如果错误仍然存​​在,那会非常令人困惑,因为它对我来说工作正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-15
      • 1970-01-01
      • 1970-01-01
      • 2017-05-17
      • 1970-01-01
      相关资源
      最近更新 更多