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