为Double类型编写一个扩展,添加一个absoluteValue属性

时间:2014-06-06 05:15:51

标签: 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 = -3.0
minusThree.absoluteValue    // 3.0

-4.0.absoluteValue  // -4.0

4 个答案:

答案 0 :(得分:10)

它只是被解析为-(4.0.absoluteValue)。这有效:

> (-4.0).absoluteValue
$R2: Double = 4

答案 1 :(得分:3)

原因是因为你错过了表达式的微妙运算符优先级。

在你的表达中:

-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()).")

答案 2 :(得分:3)

使用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

答案 3 :(得分:0)

这是我的解决方案:

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()