Swift.Extensions var和func.哪一个更好?

Kar*_*yan 4 macos ios swift

我是初学者.这是代码

extension Double  {
    func abs1() -> Double  {
        return ( self > 0 ) ? self : -1.0 * self
    }

    var abs2 : Double {
        return ( self > 0 ) ? self : -1.0 * self
    }
}
Run Code Online (Sandbox Code Playgroud)

我想知道,abs1()函数和abs2变量之间的区别是什么,它们如何工作以及哪个更好?

Rob*_*ier 5

他们的工作方式是一样的.这确实是意图的信号.我个人会推荐这种情况下的功能,这有点违反直觉,所以我会解释一下.

第一条规则是"它有副作用吗?" 如果是这样,它应该是一个功能.

第二条规则是"是O(1)吗?" (这意味着"它需要一个常数,通常假设是短暂的,一段时间才能运行."换句话说,它是"便宜吗?")如果不是,它应该是一个功能.

但第三个更微妙的规则是"它是否合理地被认为是实例的"属性"?在这种情况下,我会争辩,不.这与实例完全不同.它是在实例上计算的东西,而不是实例的固有部分.用非计算属性替换它是相当荒谬的(你永远不会将"4"存储为"-4"的"abs"字段).所以我会把它变成一个功能.

请注意,在Swift 3中,abs是类型上的静态函数(例如,它Double.abs(4.0)不是(4.0).abs).这不会使你的问题无效,但鉴于这个具体案例,团队选择解决这个问题,我觉得这是一个更好的方法.