Swift 为添加absoluteValue属性的Double类型编写扩展

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 = -

有人知道为什么最后一行输出-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 = -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