在Swift中是否存在Kotlin等效的`with`函数?

时间:2017-12-01 04:09:57

标签: swift kotlin

在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

1 个答案:

答案 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