在 Swift 中使用运算符'-'的模棱两可'abs()'



我正在尝试执行以下操作:

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都很难确定四种类型FloatDoubleFloot80CoreGraphics。CGFloat。为什么只有这四个为什么Int不在里面特别是由于Swift默认将整数文本视为Int

最新更新