2015-09-05 6 views
5

配列は次のとおりです。なぜ迅速なコンパイラは省略名の引数名を受け入れないのでしょうか?

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

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

をしかし受け入れる:var closestAnnotations:[MKAnnotation]

迅速コンパイラは受け付けませんなぜ私が思っていた私がしようとしている

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

「closestAnnotations」はどのように宣言されていますか? – Sulthan

+0

私の編集をご覧ください! :) –

+0

匂いがバグです。 '.dynamicType'は[通常のメンバーアクセス](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Expressions.html#//apple_ref)ではないという事実に関連していると思います/ doc/uid/TP40014097-CH32-ID400)、[特別な表現](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Expressions.html#//apple_ref/doc/uid/TP40014097-CH32-ID402)。しかし、私はこれについて合理的な説明を見つけることができません。 – rintaro

答えて

1

あなたのコードの異なるバージョン(Xcode 7を使用)。修正は明らかで、タイプをテストするための正しい方法であり、問​​題なく動作します。

を使用すると明らかです。

私はエラーがしかし、これは動作しません離れ

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

行かせるシンプルなコードがあることに気づいた:

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

エラーメッセージに気付いた場合、コンパイラは見ているが、クロージャーは(_) -> Boolです。

これは、式$0.dynamicTypeが何とか最適化されたという結論に導きます。

最も興味深い

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

は、同じエラーがトリガされます。

  1. コンパイラは配列の型から引数を推論することはできませんし、[Type]に呼び出されたときに(_) -> Bool(Type) -> Boolとして考慮されるべきであるので、それは間違っている:

    だから、私は2つのコンパイラのバグがあると思います。

  2. コンパイラはどうにかして$0.dynamicTypeを最適化します。それは明らかに間違っています。

+0

問題は '.dynamicType'がメンバではないことです。それはおそらく –

+1

@MatthieuRieglerはい、 'let arg = $ 0'と' arg.dynamicType == ... 'を使って問題を解決しているのでしょう。具体的には '$ 0.dynamicType'に接続されています。 – Sulthan

+0

私はアップルにバグを提出しました。彼らがこれを修正するかどうかを見てみましょう:) –

関連する問題