2014-11-10 2 views
2

아래의 코드에서 어떤 일이 벌어지고 있는지에 대해 약간 당황 스럽습니다. 나는 children가 (유형 [AnyObject]입니다) node.children에 따라 옵션 내가보고하고하는 것은 children이이 [AnyObject] 때문에 모든 종류의 정보를 포함하지 않는 것입니다, 결코 nil 때문이다 유형 [SKNode]의 행복이 될 것이라는 인상을했다? [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가 포함됩니다.

빈 바인딩 [AnyObject][SKNode]으로 캐스팅 할 수 있으므로 선택적인 바인딩 if let children = node.children as? [SKNode]은 항상 성공합니다.

처음에 node.children이 대신 [AnyObject]을 반환하는 것을 보았을 때 이상하다고 생각했습니다. 그렇다면이 인터페이스는 Objective-C 함께 작동하므로 [SKNode] 반환 할 수없는 것을 알게되었습니다.

+0

AnyObject 비트 때문에 그게 보입니다. docs를 보면 node.children이 [AnyObject]를 반환한다고합니다 (항상 SKNode가됩니다). 그것의 재밌는 방법은 NSString 객체를 다룰 수 있기 때문에 [NSString]에 캐스트하면 항상 성공할 수 있습니다. – fuzzygoat

+0

비어있을 때'[NSString]'으로 캐스트하면 성공합니다. 배열에'SKNode'가 있으면 캐스트가 발생하지 않습니다. – vacawama

+0

넵 완벽한, 나는 그것을 얻을 수있다, 나는 그것이 비어있을 수 있다는 사실을 잊고 있었다. 대단히 감사합니다, 시간 내 주셔서 감사합니다. – fuzzygoat

관련 문제