Swift 隐式附加值的数学计算

Swift 隐式附加值的数学计算,swift,swift3,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做数学运算 然

我用的是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做数学运算

然后,我试过:

let result = double1! - double2! - double3!
编译器给了我这个错误:
对成员“-”的引用模棱两可


那么正确的语法是什么呢?

一种可能的解决方法是:

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

或者干脆把你的双打投给非选项赛。您知道不能对
nil
值执行操作,对吗?

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

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

但这一准则看起来是反人类的。有没有更优雅的方法可以做到这一点?

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

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
}

作为奖励,这将适用于任何任意的
浮点类型(包括
浮点
浮点80
)。

将您的
双精度
定义为
双精度

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

非常感谢。我找到了另一个解决方案:让result=Double(double1)-double2-double3。好啊事实证明这是一个错误…我相信这实际上是一个错误,但我现在找不到重复的。在这种情况下使用optionals的实际好处是什么?在指定默认值的声明行中,不应使用隐式展开选项。然而,就算术而言,无论如何都不存在
nil
状态。(已解决,在Swift 3.1中不再是一个问题)。该示例仅为简单起见。我使用的是ObjectMapper,所以我必须使用Double声明我的类变量@我的答案解决了你的减法运算问题。这不是你想要的吗?@Vatsal Manot:不,不是。我必须将我的
Double
s定义为
Double。“你不能改变这一点。”基利克瓦萨尔马诺指的是。@Shallowthough:哦,我的错。谢谢,很好。也可以添加
lhs:T!,右:T和左:T,右:T
var double1 = 1.0
var double2 = 2.0
var double3 = 3.0