2015-09-05 25 views
5

dizidir:Neden hızlı derleyici bazen kısa argüman ismini kabul etmiyor?

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

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

Ama kabul eder:: var closestAnnotations:[MKAnnotation]

hızlı derleyici kabul etmeyecektir neden merak ediyorum ben dışarı çalışıyorlar

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

'En yakınAnonlamalar 'nasıl bildirilir? – Sulthan

+0

Lütfen düzenlememe bakın! :) –

+0

Bir böcek gibi kokuyor. “.dynamicType” ın [normal üye girişi] olmaması ile ilgili olduğunu düşünüyorum (https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Expressions.html#//apple_ref/doc/uid/TP40014097-CH32-ID400), ancak [özel bir ifade] (https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Expressions.html#//apple_ref/doc/uid/TP40014097-CH32-ID402). Fakat bunun hakkında makul bir açıklama bulamıyorum. – rintaro

cevap

1

kodunuzun farklı sürümleri (Xcode 7'yi kullanarak). Düzeltme, türleri test etmenin doğru yolu olan

kullanarak, herhangi bir sorun olmadan çalışır.

hata uzakta Ancak

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

gitmek yapar basit kod olduğunu fark etmiş, bu işe yaramazsa: Hata iletisini görürseniz

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

, derleyici görür (_) -> Bool olarak kapanır. Bu, $0.dynamicType ifadesinin bir şekilde en iyi duruma getirilmiş olduğu sonucuna götürür.

En ilginci

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

aynı hataya neden olur. derleyici dizinin türünden bağımsız değişkeni tahmin edemediği ve [Type] çağrıldığında (_) -> Bool(Type) -> Bool olarak kabul edilmelidir, çünkü bu yanlış

  1. :

    Yani iki derleyici hata olduğunu düşünüyorum.

  2. Derleyici, bir şekilde $0.dynamicType'u en iyi duruma getirir ve bu kesinlikle yanlıştır.

+0

Sorun, '.dynamicType'ın bir üye olmamasıdır. Muhtemelen neden –

+1

@MatthieuRiegler Evet, 'let arg = $ 0' ve sonra 'arg.dynamicType == ...' kullanarak sorunu da çözer. Özellikle $ 0.dynamicType 'a bağlı. – Sulthan

+0

Elmada bir hata yaptım.Bakalım eğer bunu düzelteceklerse :) –

İlgili konular