隐式解包的可选值的数学计算

时间:2017-01-27 07:31:48

标签: swift swift3

我正在使用Swift 3.0。 我有以下代码:

var double1 : Double! = 1.0
var double2 : Double! = 2.0
var double3 : Double! = 3.0

当我尝试这样计算时:

let result = double1-double2-double3

编译器给了我错误:
二元运算符' - '不能应用于'Double'和'Double!'类型的操作数

我发现 double1-double2 会产生一个Double值,因此不能用Double做数学!

然后,我试过了:

let result = double1! - double2! - double3!

编译器给了我这个错误:
对成员的模糊引用' - '

那么这个语法的正确性是什么?

4 个答案:

答案 0 :(得分:2)

将这些自定义运算符重载添加到项目中:

public func + <T: FloatingPoint>(lhs: T!, rhs: T!) -> T!
{
    if let lhs = lhs, let rhs = rhs
    {
        return lhs + rhs
    }

    return nil
}

public func - <T: FloatingPoint>(lhs: T!, rhs: T!) -> T!
{
    if let lhs = lhs, let rhs = rhs
    {
        return lhs - rhs
    }

    return nil
}

public func * <T: FloatingPoint>(lhs: T!, rhs: T!) -> T!
{
    if let lhs = lhs, let rhs = rhs
    {
        return lhs * rhs
    }

    return nil
}

public func / <T: FloatingPoint>(lhs: T!, rhs: T!) -> T!
{
    if let lhs = lhs, let rhs = rhs
    {
        return lhs / rhs
    }

    return nil
}

它将允许您尝试的内容:

var double1 : Double! = 1.0
var double2 : Double! = 2.0
var double3 : Double! = 3.0

let result = double1 - double2 - double3 // -4

而且,作为奖励,这适用于任意FloatingPoint类型(包括FloatFloat80)。

答案 1 :(得分:1)

一种可能的解决方法是:

let result = (double1 - double2) as Double - double3

或者只是将你的双打投入非选项。您知道您无法真正对nil值执行操作,对吗?

答案 2 :(得分:0)

好的,我找到了一个解决方案。我可以用:

let result = Double(double1) - Double(double2) - Double(double3)

但代码看起来反人性化。有更优雅的方式吗?

答案 3 :(得分:0)

Double定义为Double

var double1 : Double = 1.0
var double2 : Double = 2.0
var double3 : Double = 3.0

也可以推断出类型:

var double1 = 1.0
var double2 = 2.0
var double3 = 3.0