2015-12-12 10 views
8

スイフトで、私は次のことをやろうとしている:あいまいな使用 'ABS()'

var i = -(abs(-3)) 

または

var i = -abs(-3) 

または

var i = -abs(3) 

または

var i = -(abs(3)) 

しかし、マイナスの使用があいまいであるというエラーが表示されます。どうして?

+0

あなたは 'abs(-3)* -1'を試すことができます。 –

答えて

5

私にはコンパイラのバグのようですが、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 
+0

'var i = - (abs(-3 as Int))'も動作します。 – vacawama

+1

私たち人間はこれを内側から考えている傾向があります。'3'は' Int'なので '-3'は当然' Int'、 'abs'は' Int'を返し、 'Int'と単項' -'は 'Int'で定義されています作業。 Swiftコンパイラは他の方向から接近している可能性があります。単項マイナスはこれらすべての型で動作し、 'abs'はこの型のサブセットを返し、' abs'はこれらの可能な型を入力とし、 '3'はa 'integerLiteralConvertible'のための型の束なので、式に単項' -'を加えることで、Swiftは広範囲の型から始まり、決して1に絞ることはできません。 – vacawama

+1

@vacawama:しかし、 'var i = abs(-3)'もあいまいですが、そうではありません –

2

私は、これはコンパイラのバグのように見えること@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.CGFloat 
012:

var i = -(3 + 2) 

がで失敗

var i = -(3) 

で失敗します。でも、ことに注意してください

たびに、4種類のフロートダブルFloat80、およびCoreGraphics.CGFloatは、スウィフトはトラブルの中で決定をしているタイプです。なぜこれらの4つだけ? なぜそこにIntはありませんか?特に、スウィフトは整数リテラルをIntとして扱うことがデフォルトであるためです。

関連する問題