2014-11-11 1 views
0

각 SKNode의 이름을 얻는 코드를 작성하는 더 좋은 방법은 없습니까? 조금 길어 보입니다.Swift 옵션 바인딩 및 SKNode.name

// eachChild is an SKNode 
for eachChild in children { 
    var theActualChildName: String 
    if let childName = eachChild.name { 
     theActualChildName = childName 
    } else { 
     theActualChildName = "Undefined" 
    } 
    println("NODE NAME = \(theActualChildName)") 
} 

이름이 없어도 작동하는 (아래 참조)하지만, 선택 사항을 언 래핑하는 것이 좋지 않은 것처럼 느껴지는 경우 (아래 참조) 작성할 수 있습니다. 내가 스위프트를 알고

// eachChild is an SKNode 
for eachChild in children { 
    println("NODE NAME = \(eachChild.name!)") 
} 

는 모든 안전에 관한 것입니다,하지만 난 코드에서 수렁에 빠져 점점 오전 뭔가가 실종 된 경우 궁금처럼 그냥 느낌?

편집 : SKNode.name이 문자열인지 알 수 있습니까? 당신이 강제로 unwrap하면 반환하는 값이 없으며 빈 문자열 "", 나는 그것을 반환 할 것이라고 생각했다.

EDIT2 : 그냥 안토니오 대답은 내가 후에 무엇인지 참으로하지만, 노드가 scene.SKS 파일에서 오는 SKNode.name의 경우는 비록 어떤 이름이 노드를 지정하지 않은 것 같습니다 참고하기 여전히 이름은 "" (빈 문자열)입니다. 당신이 코드를 실행하면 : 당신은 "Name" 또는 ""를 부여받을 것 중 하나

let childName = eachChild.name ?? "Undefined" 

당신이 eachChild.name = nil을 설정하면 "Undefined"를 얻을하지 않습니다 그리고 당신은 내가 이름 속성이지고 있다고 가정하고 "Undefined"을 얻을 것이다 위의 코드를 실행 다른 값을 지정하지 않으면 *.sks 파일의 ""로 설정하십시오.

답변

3

내가 name이 선택 필드입니다 것을 가정 - 당신이 nil coalescing operator 사용할 수 있습니다

let actualChildName = eachChild.name ?? "Undefined" 
+2

그래를, 가장 좋은 방법은 같다. (예를 들어 이것을 좀 더 기능적인 작업과 결합하여 이름 배열을 만들려면 단 한 줄만 있으면됩니다 : let namesArray = children.map {$ 0.name ?? "Undefined"}') –

+0

그래,'map'의 좋은 사용법. 끝이없는 것들은 단지'map','filter','reduce'의 3 가지 방법으로 끝낼 수 있습니다 :) – Antonio

+0

안토니오의 고맙습니다. – fuzzygoat

관련 문제