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
}
}
我希望有人能为此找到解决方案。提前谢谢。
答案 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)清除错误,则会重新加载它们。如果错误仍然存在,那将非常令人困惑,因为它对我来说很好。