我正在使用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!
编译器给了我这个错误:
对成员的模糊引用' - '
那么这个语法的正确性是什么?
答案 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
类型(包括Float
和Float80
)。
答案 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