Swift 隐式附加值的数学计算
我用的是Swift 3.0。 我有以下代码: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做数学运算 然
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