2016-12-13 8 views
0

Я пытаюсь определить класс объекта в иерархии классов. Я теряюсь, чтобы объяснить, почему тест в приведенном ниже примере терпит неудачу.Определение типа класса Swift

class BasicLocation {} 
     class AddressLocation : BasicLocation {} 
     class ContactLocation : BasicLocation {} 

     func mapView(_ mapView : MKMapView, viewFor: MKAnnotation) 
     ->MKAnnotationView?{ 
     if let test = viewFor as? BasicLocation { 
      let basicType = BasicLocation() 
      let a = type(of:test) 
      let b = type(of:basicType) 
      let c = type(of:test) 
      NSLog("a=\(a), type of a=\(type(of:a))") 
      NSLog("b=\(b), type of b=\(type(of:b))") 
      NSLog("c=\(c), type of b=\(type(of:c))") 
      if a == b { 
       NSLog("passed a and b") 
      } else { 
       NSLog("a and b do not match match") 
      } 
      if a == c { 
       NSLog("passed a and c") 
      } 

output 

>a=BasicLocation, type of a=BasicLocation.Type 
>b=BasicLocation, type of b=BasicLocation.Type 
>c=BasicLocation, type of b=BasicLocation.Type 
>a and b do not match match 
>a and c natch 
+0

Что такое ViewFor здесь? Мы не можем видеть код, который его настроил, поэтому мы не знаем, как это влияет на результат. –

+0

Что такое 'test'? – holex

+0

Это может быть удобно знать: http://stackoverflow.com/a/40388434/3141234 – Alexander

ответ

0

После того, как вы сказали

if let test = viewFor as? BasicLocation 

... Если тест пройден, стоп. Теперь вы знаете, что test является экземпляром BasicLocation, иначе мы бы не прошли тест.

Все остальное, что вы делаете, просто глупо. Сравнение равенств между метатипами не определено.

+0

Первый тест определяет только, что класс является членом иерархии. Возникает вопрос, какой класс в иерархии. – Stephen

+1

Тогда спросите об этих классах. Я не вижу другого вопроса в вашем вопросе, поэтому я ответил в соответствии с тем, что я мог видеть. – matt