2015-12-12 15 views

Odpowiedz

5

To wygląda dla mnie jak kompilator, typ literału 3 powinien być Int. Ale kompilator narzeka

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 

Można go rozwiązać z wyraźną Int jako parametru:

var i = -(abs(-Int(3))) 

lub z adnotacją typ na wynik:

var i : Int = -(abs(-3)) 

Jak @vacawama zauważył, istnieje więcej możliwych rozwiązań. Casting dowolny podwyrażenie do Int sprawia, że ​​kompilator szczęśliwy:

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 jak Int)) również działa. – vacawama

+1

My, ludzie, myślimy o tym od środka.'3' to' Int', więc '-3' to oczywiście' Int', 'abs' przyjmuje' Int' i zwraca 'Int' i unary' -' jest zdefiniowane w 'Int', więc powinno to praca. Kompilator Swift prawdopodobnie zbliża się z przeciwnego kierunku ... Jednoargowy minus działa na wszystkie te typy, 'abs' zwraca ten podzbiór typów,' abs' przyjmuje te możliwe typy jako dane wejściowe, a '3' może być dowolną z pęczek typów z powodu 'integerLiteralConvertible', więc dodając jednoargumentowy' -' do wyrażenia Swift zaczyna się szerokim zakresem typów i nigdy nie jest w stanie zawęzić go do jednego. – vacawama

+1

@vacawama: Ale wtedy 'var i = abs (-3)' byłby również niejednoznaczny (ale nie jest) –

2

zgadzam się z @MartinR że to wygląda na błąd kompilatora. Więc gdzie jest problem?

Moje eksperymenty wskazują na jednoargumentowy minus jako winowajcę. Zauważ, że nawet:

var i = -(3) 

nie powiedzie się z:

 
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** 

To proste wyrażenie:

var i = -(3 + 2) 

nie powiedzie się z:

 
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 

Za każdym razem, cztery rodzaje Float, Pokój, Float80 i CoreGraphics.CGFloat są rodzaje Swift ma problemy z podjęciem decyzji, wśród. Dlaczego tylko te cztery? Dlaczego Int nie jest tam? Zwłaszcza, że ​​Swift domyślnie traktuje literał całkowity jako Int.

Powiązane problemy