Swift 为添加absoluteValue属性的Double类型编写扩展
有人知道为什么最后一行输出-4.0而不是4.0吗Swift 为添加absoluteValue属性的Double类型编写扩展,swift,Swift,有人知道为什么最后一行输出-4.0而不是4.0吗 extension Double { var absoluteValue: Double { if self > 0.0 { return self } else { return -1 * self } } } var minusTwo = -2.0 minusTwo.absoluteValue // 2.0 let minusThree = -
extension Double {
var absoluteValue: Double {
if self > 0.0 {
return self
}
else {
return -1 * self
}
}
}
var minusTwo = -2.0
minusTwo.absoluteValue // 2.0
let minusThree = -3.0
minusThree.absoluteValue // 3.0
-4.0.absoluteValue // -4.0
它只是被解析为
-(4.0.absoluteValue)
。这项工作:
> (-4.0).absoluteValue
$R2: Double = 4
原因是,您错过了表达式的微妙运算符优先级 在你的表达中:
-4.0.absoluteValue
有两个运算符,-(一元减运算符,前缀)和。(方法运算符)。这似乎是优先考虑的。已覆盖-,表达式已解析为:
-(4.0.absoluteValue)
因此,得到4.0的绝对值的结果,然后用一元减号运算符翻转,得到-4.0
通过更深入地查看Swift头文件,我注意到。(方法运算符)不在运算符列表中。这意味着。是语言所依赖的更基本的运算符,不能像其他普通运算符那样重载
我是这么想的。具有比任何其他内容(包括+-*/=)更高的优先级,因此会导致混淆
顺便说一句,这是我的解决方案。我将absoluteValue作为一种方法,因为它比将其作为属性更有意义
extension Double {
func absoluteValue() -> Double {
if self < 0 {
return -self
} else {
return self
}
}
}
let myDouble: Double = -7.65
println("The absolute value of \(myDouble) is \(myDouble.absoluteValue()).")
双分机{
func absoluteValue()->Double{
如果self<0{
回归自我
}否则{
回归自我
}
}
}
让myDouble:Double=-7.65
println(“\(myDouble)的绝对值是\(myDouble.absoluteValue())。)
以下是我的解决方案:
extension Double{
// Abs property
var absoluteValue: Double{
return Double.abs(self)
}
// Abs method
func absValFunc() ->Double{
return Double.abs(self)
} }
var doubleValue = -36.00
doubleValue.absoluteValue
doubleValue.absValFunc()
使用Swift 4.0.2进行测试:
extension Double {
var absoluteValue: Double {
return abs(self)
}
}
var x = -75.34
print(x.absoluteValue) // Prints 75.34
print((-31.337).absoluteValue) // Prints 31.337
但是,(-4.0).absoluteValue//4.0一个建议:问题是要添加属性,而不是方法。Try:
var absoluteValue:Double{if(self<0){return self*-1}return self}
你能解释一下你的代码吗?特别是,请解释它如何回答“有人知道为什么最后一行输出-4.0而不是4.0吗?”。此外,Swift 4标准库的行为与所讨论的扩展相同…(lldb)表达式-4.0.magnize==>(双精度)$R5=-4和(lldb)表达式(-4.0)。magnize=>(双精度)$R6=4