在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函数相同withfunction?

 // 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) ,这两者也会因为相对紧凑而被内联。 无论哪种方式,你应该知道这个关键字不影响这些的逻辑和结果,因为内联是关于优化程序 。