スイフトで、私は次のことをやろうとしている:あいまいな使用 'ABS()'
var i = -(abs(-3))
または
var i = -abs(-3)
または
var i = -abs(3)
または
var i = -(abs(3))
しかし、マイナスの使用があいまいであるというエラーが表示されます。どうして?
スイフトで、私は次のことをやろうとしている:あいまいな使用 'ABS()'
var i = -(abs(-3))
または
var i = -abs(-3)
または
var i = -abs(3)
または
var i = -(abs(3))
しかし、マイナスの使用があいまいであるというエラーが表示されます。どうして?
私にはコンパイラのバグのようですが、3
の型はInt
である必要があります。 、@vacawamaが気づいたよう
var i : Int = -(abs(-3))
:結果に
var i = -(abs(-Int(3)))
や型注釈付き:しかし、コンパイラは、あなたがパラメータとして明示的Int
でそれを解決することができ
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 i1 = -(abs(-(3 as Int)))
var i2 = -(abs((-3) as Int))
var i3 = -(abs(-3) as Int)
var i4 = -(abs(-3)) as Int
'var i = - (abs(-3 as Int))'も動作します。 – vacawama
私たち人間はこれを内側から考えている傾向があります。'3'は' Int'なので '-3'は当然' Int'、 'abs'は' Int'を返し、 'Int'と単項' -'は 'Int'で定義されています作業。 Swiftコンパイラは他の方向から接近している可能性があります。単項マイナスはこれらすべての型で動作し、 'abs'はこの型のサブセットを返し、' abs'はこれらの可能な型を入力とし、 '3'はa 'integerLiteralConvertible'のための型の束なので、式に単項' -'を加えることで、Swiftは広範囲の型から始まり、決して1に絞ることはできません。 – vacawama
@vacawama:しかし、 'var i = abs(-3)'もあいまいですが、そうではありません –
私は、これはコンパイラのバグのように見えること@MartinRに同意します。だから問題はどこにあるの?
私の実験では、単項マイナスが犯人になります。この単純な式
error: ambiguous use of operator '-' var i = -(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: CoreGraphics.CGFloat) -> CoreGraphics.CGFloat**
:
error: ambiguous use of operator '+' var i = -(3 + 2) ^ Swift.+:2:13: note: found this candidate public func +(lhs: Float, rhs: Float) -> Float ^ Swift.+:2:13: note: found this candidate public func +(lhs: Double, rhs: Double) -> Double ^ Swift.+:2:13: note: found this candidate public func +(lhs: Float80, rhs: Float80) -> Float80 ^ CoreGraphics.+:2:13: note: found this candidate public func +(lhs: CoreGraphics.CGFloat, rhs: CoreGraphics.CGFloat) -> CoreGraphics.CGFloat012:
var i = -(3 + 2)
がで失敗
var i = -(3)
で失敗します。でも、ことに注意してください
たびに、4種類のフロート、ダブル、Float80、およびCoreGraphics.CGFloatは、スウィフトはトラブルの中で決定をしているタイプです。なぜこれらの4つだけ? なぜそこにIntはありませんか?特に、スウィフトは整数リテラルをInt
として扱うことがデフォルトであるためです。
あなたは 'abs(-3)* -1'を試すことができます。 –