我是初学者。
这是代码
extension Double {
func abs1() -> Double {
return ( self > 0 ) ? self : -1.0 * self
}
var abs2 : Double {
return ( self > 0 ) ? self : -1.0 * self
}
}
我想知道,abs1() 函数和 abs2 变量有什么区别,它们是如何工作的,哪个更好?
它们的工作方式相同。这确实是一个意图的信号。我个人会推荐这种情况下的功能,它有点违反直觉,所以我会解释。
第一个规则是“它有副作用吗?”如果是这样,它应该是一个函数。
第二条规则是“是 O(1) 吗?” (这意味着“它需要一个常量,并且通常被认为是很短的时间来运行。”换句话说,它“便宜吗?”)如果不是,它应该是一个函数。
但第三个更微妙的规则是“它是否被合理地视为实例的“属性”?”在这种情况下,我会争辩说,不。它与实例完全不同。它是在实例上计算的东西,而不是实例的固有部分。用非计算属性替换它是相当荒谬的(你永远不会将“4”存储为“-4”的“abs”字段)。所以我会把它变成一个函数。
请注意,在 Swift 3 中,abs
是类型上的静态函数(例如,它是 Double.abs(4.0)
而不是 (4.0) .abs
).这不会使您的问题无效,但考虑到这个特定案例,这就是团队选择解决它的方式,我认为这是更好的方法。