在Kotlin,我们可以改变下面的
// Original code
var commonObj = ClassCommonObj()
commonObj.data1 = dataA
commonObj.data2 = dataB
commonObj.data3 = dataC
// Improved code
var commonObj = ClassCommonObj()
with(commonObj) {
data1 = dataA
data2 = dataB
data3 = dataC
}
但是在下面的Swift中,我是否可以使用等效的with
函数?
// Original code
var commonObj = ClassCommonObj()
commonObj.data1 = dataA
commonObj.data2 = dataB
commonObj.data3 = dataC
答案 0 :(得分:5)
不幸的是,目前在Swift中还没有这样的功能。但是,使用扩展功能可以实现类似的功能:
protocol ScopeFunc {}
extension ScopeFunc {
@inline(__always) func apply(block: (Self) -> ()) -> Self {
block(self)
return self
}
@inline(__always) func with<R>(block: (Self) -> R) -> R {
return block(self)
}
}
此协议和扩展提供了两个inline
函数,其中一个可以用于返回已处理的对象,另一个与Kotlin和其他语言中的with
严格相似(90年代支持Visual Basic)
<强>用法强>
指定这些函数应适用的类型:
extension NSObject: ScopeFunc {}
<强> apply
强>:
let imageView = UIImageView().apply {
$0.contentMode = .scaleAspectFit
$0.isOpaque = true
}
这里我们创建一个对象,一旦执行了闭包,就会返回修改后的对象。
<强> with
强>:
imageView.with {
$0.isHidden = true
}
在Kotlin中等于with
。
最初基于this source code。
注意:强>
Swift编译器通常被认为足够聪明,可以决定是否应该内联函数。很可能,即使没有严格指定@inline (__always)
,这两个也会因为相对紧凑而内联。无论哪种方式,您都应该知道此关键字不会影响逻辑及其结果,因为内联大约是optimizing the program。