2014-12-09 2 views
-2

Here is swift tutorial link!Свифт Тип проверки

Пример является:

let library = [ 
     Movie(name: "Casablanca", director: "Michael Curtiz"), 
     Song(name: "Blue Suede Shoes", artist: "Elvis Presley"), 
     Movie(name: "Citizen Kane", director: "Orson Welles"), 
     Song(name: "The One And Only", artist: "Chesney Hawkes"), 
     Song(name: "Never Gonna Give You Up", artist: "Rick Astley") 
    ] 

учебника сказать: Если перебирать содержимое этого массива, деталь вы получаете назад набираются, как MediaItem, а не как кино или песни.

И Тип проверки: Используйте оператор проверки типа (is), чтобы проверить, является ли экземпляр определенного типа подкласса. Оператор проверки типа возвращает true, если экземпляр имеет тип подкласса и false, если это не так.

var movieCount = 0 
var songCount = 0 

for item in library { 
    if item is Movie { 
    ++movieCount 
    } else if item is Song { 
    ++songCount 
    } 
} 

Так что, когда я получить деталь, тип элемента является MediaItem

но почему "пункт Movie" будет возвращать Trun ??

Поскольку фильм является подклассом MediaItem

Так что если я получить тип MediaItem

Это должно быть записано как «видеофильма пункт»

Среднее Фильм является подклассом MediaItem правильно?

но почему написано «пункт Movie»

+0

Вы знаете, что '' Movie' и Song' являются подклассами 'MediaItem'? Или вам трудно понять концепцию наследования? – DarkDust

+0

Вы понимаете мою проблему? –

+0

Моя проблема в том, почему «item is Movie» является истинным, , потому что элемент является типом MediaItem not Тип фильма –

ответ

2

Похоже, у вас есть проблемы с различием между типом переменной и типа объекта, который присваивается переменной.

Может быть, это может дать вам немного понять:

let movie = Movie(name: "Casablanca", director: "Michael Curtiz") 
var test : AnyObject = movie 

println(test is Movie) // "true" since it's an instance of Movie 
println(test is MediaItem) // "true" since Movie is a subclass of MediaItem 
println(test is Song) // "false", it's not a Song. 

// Assign to variable of type MediaItem works because Movie is 
// a subclass of MediaItem 
let item : MediaItem = movie 

println(item is Movie) // "true" since the object really is a Movie 
println((item as AnyObject) is MediaItem) // "true" since Movie is a subclass of MediaItem 
println(item is Song) // "false", it's not a Song. 

// The next line does NOT work: "upcasting" is not allowed. 
// You will get a compiler error here. 
let anotherMovie : Movie = item 
+0

У вашего кода много ошибок, невозможно компилятор –

+0

@CKvir: компилятор Swift здесь слишком умен и вызывает ошибку, когда он обнаруживает, что условие всегда будет истинным ... но если вам нравится код, который работает, см. Мое обновление. Мой пример пытался показать вам важный момент наследования; Я не ожидал, что вы его скомпилируете, чтение будет достаточно. – DarkDust

+0

Правильная версия, которая компилирует, не показывает точку, которую я пытался сделать так четко. Главное, что вам нужно понять, это то, что тип _object_ может отличаться от типа _variable_, которому он назначен: даже если 'item' имеет тип' MediaItem', объект, на который он указывает, на самом деле является 'Movie '. Аналогично, 'test' имеет тип' AnyObject', но объект, на который он указывает, также является 'Movie' (фактически, как' test', так и 'item' указывают на тот же объект). – DarkDust

Смежные вопросы