2015-09-05 1 views
5

Das Array ist: var closestAnnotations:[MKAnnotation]Warum akzeptiert der swift-Compiler manchmal nicht den Argumentnamen für Kurznamen?

ich mich gefragt, warum die schnellen Compiler nicht akzeptieren:

let closestStationAnnotations = closestAnnotations.filter({ 
     $0.dynamicType === StationAnnotation.self 
    }) 

Cannot convert value of type (_) -> Bool to expected argument type (MKAnnotation) -> Bool

Aber akzeptiert:

let closestStationAnnotations = closestAnnotations.filter({ 
     (annotation : MKAnnotation) -> Bool in 
     annotation.dynamicType === StationAnnotation.self 
    }) 
+0

Wie wird 'engsteAnnotationen' deklariert? – Sulthan

+0

Bitte sehe meine Bearbeitung! :) –

+0

Riecht wie ein Käfer. Ich denke, es hängt damit zusammen, dass '.dynamicType' kein [normaler Mitgliederzugriff] ist (https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Expressions.html#//apple_ref/doc/uid/TP40014097-CH32-ID400), aber [ein spezieller Ausdruck] (https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Expressions.html#//apple_ref/doc/uid/TP40014097-CH32-ID402). Aber ich kann keine vernünftige Erklärung dafür finden. – rintaro

Antwort

1

Ich habe aus versucht, verschiedene Versionen Ihres Codes (mit Xcode 7). Die Lösung ist offensichtlich,

let closestStationAnnotations = closestAnnotations.filter({ 
    $0 is StationAnnotation 
}) 

verwendet, die die richtige Art und Weise ist Typen zu testen, funktioniert ohne Probleme.

habe ich bemerkt, dass es einfacher Code, der Fehler weg jedoch

let closestStationAnnotations = closestAnnotations.filter({ 
    print("\($0)") 
    return ($0.dynamicType === StationAnnotation.self) 
}) 

gehen macht, das nicht funktioniert:

let closestStationAnnotations = closestAnnotations.filter({ 
    return ($0.dynamicType === StationAnnotation.self) 
}) 

Wenn Sie die Fehlermeldung fest, sieht der Compiler der Verschluss als (_) -> Bool. Das führt mich zu der Schlussfolgerung, dass der Ausdruck $0.dynamicType irgendwie optimiert ist.

Interessanter

let closestStationAnnotations = closestAnnotations.filter({ 
    return true 
}) 

den gleichen Fehler auslösen.

Also ich denke, es gibt zwei Compiler-Fehler:

  1. Der Compiler nicht das Argument vom Typ des Arrays entnehmen kann, und das ist falsch, weil (_) -> Bool sollte als (Type) -> Bool in Betracht gezogen werden, wenn sie auf [Type] genannt.

  2. Der Compiler optimiert irgendwie $0.dynamicType aus und das ist offensichtlich falsch.

+0

Das Problem ist, dass '.dynamicType' kein Mitglied ist. Das ist wahrscheinlich der Grund warum –

+1

@MatthieuRiegler Ja, mit 'let arg = $ 0' und dann' arg.dynamicType == ... 'löst das Problem auch. Es ist speziell mit $ 0.DynamicType verbunden. – Sulthan

+0

Ich habe einen Fehler bei Apple eingereicht.Mal sehen, ob sie das beheben werden :) –