2014-11-10 3 views
2

Я немного озадачен тем, что происходит с кодом ниже. Я был под впечатлением, что children будет необязательным на основе node.children (который типа [AnyObject]) быть типа [SKNode] То, что я вижу в том, что children никогда не nil, это потому, что [AnyObject] не содержит никакой информации о типе? Даже если я изменю [SKNode] на [NSString], он по-прежнему идет к (1)?Вниз от AnyObject?

if let children = node.children as? [SKNode] { 
     // (1) STUFF WITH SKNODE... 
    } else { 
     // (2) NOPE, ITS NOT AN SKNODE 

ответ

3

node.children не является обязательным. Он всегда возвращает массив типа [AnyObject]. Если детей нет, этот массив будет содержать 0 элементов. Если есть дети, то этот массив будет содержать SKNode s.

Необязательное связывание if let children = node.children as? [SKNode] всегда будет успешным, поскольку пустой массив объектов [AnyObject] может быть отлит до [SKNode].

Когда я впервые увидел, что node.children возвращался [AnyObject] вместо [SKNode] Я думал, что это было странно. Тогда я понял, что это интерфейс Cocoa Touch, который работает с Objective-C, поэтому он не сможет вернуть [SKNode], хотя это то, что он содержит.

+0

Я вижу, это из-за бит AnyObject. Если вы посмотрите в документах, это говорит о том, что node.children возвращает [AnyObject] (что всегда будет SKNodes). Смешно, как это всегда удается, если вы отбросили его на [NSString], я думаю, это потому, что AnyObject также охватывает объекты NSString. – fuzzygoat

+0

Это удается только тогда, когда вы набрасываете его на '[NSString]', когда он пуст. Если бы в массиве каких-либо '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''' – vacawama

+0

yup perfect, я понял, я забыл о том, что он может быть пустым. Большое спасибо господину, спасибо за ваше время. – fuzzygoat