首页 文章

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

提问于
浏览
6

在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 回答

  • 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) .

    Usage

    指定这些函数应该应用于的类型:

    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 .

    NOTE:

    Swift编译器通常被认为足够聪明,可以决定是否应该内联函数 . 很可能,即使没有严格指定 @inline (__always) ,这两个也会因为相对紧凑而内联 . 无论哪种方式,您都应该知道此关键字不会影响逻辑及其结果,因为内联大约是optimizing the program .

相关问题