我正在尝试执行以下操作:
var i = -(abs(-3))
或
var i = -abs(-3)
或
var i = -abs(3)
或
var i = -(abs(3))
但我有一个错误,说减号的使用是模棱两可的。为什么?
对我来说,这看起来像是一个编译器错误,文本3
的类型应该是CCD_ 2。但是编译器抱怨
error: ambiguous use of operator '-'
var i = -(abs(-3))
^
Swift.-:2:20: note: found this candidate
prefix public func -(x: Float) -> Float
^
Swift.-:2:20: note: found this candidate
prefix public func -(x: Double) -> Double
^
Swift.-:2:20: note: found this candidate
prefix public func -(x: Float80) -> Float80
^
CoreGraphics.-:2:20: note: found this candidate
prefix public func -(x: CGFloat) -> CGFloat
您可以使用显式Int
作为参数来解决它:
var i = -(abs(-Int(3)))
或者在结果上添加类型注释:
var i : Int = -(abs(-3))
正如@vacawama所注意到的,还有更多可能的解决方案。将任何子表达式强制转换为Int
会让编译器感到高兴:
var i1 = -(abs(-(3 as Int)))
var i2 = -(abs((-3) as Int))
var i3 = -(abs(-3) as Int)
var i4 = -(abs(-3)) as Int
我同意@MartinR的观点,认为这看起来像是一个编译器错误。那么问题出在哪里呢?
我的实验表明一元负是罪魁祸首。请注意,偶数:
var i = -(3)
失败:
错误:运算符"-"的使用不明确var i=-(3)^Swift。-:2:20:注:找到此候选人prefix public func-(x:foat)->Float^Swift。-:2:20:注:找到此候选人前缀public func-(x:Double)->Double^Swift。-:2:20:注:找到此候选人前缀公共函数-(x:Float80)->Float80%^CoreGraphics。-:2:20:注:找到此候选人前缀公共函数-(x:CoreGraphics.CGFloat)->CoreGraphics.CGFloat**
这个简单的表达式:
var i = -(3 + 2)
失败:
错误:运算符"+"的使用不明确var i=-(3+2)^Swift+:2:13:注意:找到了这个候选人public func+(lhs:Float,rhs:Floate)->浮点^Swift+:2:13:注意:找到了这个候选人public func+(lhs:Double,rhs:Double)->Double^Swift+:2:13:注意:找到了这个候选人public func+(lhs:Float80,rhs:Float 80)->Float^CoreGraphics.+:2:13:注意:找到了这个候选人public func+(lhs:CoreGraphics.CGLoat,rhs:CoreGraphics.CGFloat)->CoreGraphics.CGFloat
每次,Swift都很难确定四种类型Float、Double,Floot80和CoreGraphics。CGFloat。为什么只有这四个为什么Int不在里面特别是由于Swift默认将整数文本视为Int
。