在Swift中是否有与Kotlin等效的“function?
在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
函数相同with
function?
// Original code var commonObj = ClassCommonObj() commonObj.data1 = dataA commonObj.data2 = dataB commonObj.data3 = dataC
不幸的是,在Swift中目前还没有这样的function。 但是,类似的function可以通过扩展的function来实现:
protocol ScopeFunc {} extension ScopeFunc { @inline(__always) func apply(block: (Self) -> ()) -> Self { block(self) return self } @inline(__always) func with(block: (Self) -> R) -> R { return block(self) } }
此协议和扩展提供了两个inline
函数,其中一个可用于返回处理对象,另一个with
Kotlin和其他语言(90年代支持的Visual Basic)严格类似。
用法
指定这些函数应该适用的types:
extension NSObject: ScopeFunc {}
apply
:
let imageView = UIImageView().apply { $0.contentMode = .scaleAspectFit $0.isOpaque = true }
在这里我们创建一个对象,一旦闭包被执行,被修改的对象被返回。
with
:
imageView.with { $0.isHidden = true }
with
Kotlin相同的作品。
基于这个源代码的源代码 。
注意:
Swift编译器通常被认为足够聪明,以决定是否应该内联一个函数。 很可能,即使没有严格指定@inline (__always)
,这两者也会因为相对紧凑而被内联。 无论哪种方式,你应该知道这个关键字不影响这些的逻辑和结果,因为内联是关于优化程序 。