2015-01-02 5 views
2

을 풀기의 다른 방법 난 그냥 바로 얻을 것이다 :스위프트 선택적 개체 -

var test: String? 
test = "this is an optional string" 

if test != nil { 
    println("\(test!) IS NOT nil") 
} else { 
    println("test is nil") 
} 

if let test = test { 
    println("\(test) IS NOT nil") 
} else { 
    println("test is nil") 
} 

모두 출력에서 ​​동일한 결과 :

사이의 차이 무엇입니까 운동장.

나는 암시 적으로 unwrapping은 (대부분의 경우) 안전하다고 생각하지 않지만, 여기서 unwrapping하기 전에 그 값이 nil인지 아닌지 확인하고있다.

두 가지 방법 모두 유효하며 하나가 더 나은 선택으로 간주되는 다른 시나리오가 있습니까?

+0

let은 단 하나의 명령문에서 nil을 풀고 테스트하는 패턴 일뿐입니다. 자세한 정보는 링크를 읽으십시오. https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/OptionalChaining.htaccess Admin Home English Language Content – rakeshbs

+3

코드를 검토 할 때 모든 언 래핑 (unwrap)이 내 머리 속의 종소리를 울리며, 해당 변수가 0이 될 가능성을 충분히 막았는지 확인해야합니다. 이것은 코드 블록이 여러 줄로 길고 단순하지 않은 경우 특히 그렇습니다. – vacawama

답변

5

두 가지 방법 모두 유효하며 하나가 더 나은 선택으로 간주되는 다른 시나리오가 있습니까?

if-let 형태가에서 작동 할 수있는 모든 경우에 더 나은 선택입니다. ! 발음하는 올바른 방법은 당신이 때문에 "나는, 내 프로그램의 삶에 맹세"입니다.

귀하의 예는 간단한 양식이며, 사소한 형태로는 문제가 어떻게 발생 하는지를보기가 어렵습니다. I 그냥에 대해 nil에 대해 테스트했습니다. 무엇이 잘못 될 수 있습니까? 그러나 소프트웨어가 성장하고 소프트웨어가 바뀝니다. != nil 검사는 수십 년 동안 사용해온 C 및 Java 검사와 동일하며 수십 년 동안 프로그램을 중단 시켰습니다. 컴파일러가 필요로하는 필수 테스트를 놓치는 것은 사실 매우 쉽습니다. 그리고 사람들은 늘 그렇습니다.

코드를 다시 배열하고 println을 함수로 이동하면 if 테스트를 이동하는 것을 잊지 않았습니까? 큰 기능의 경우 if 테스트가 맨 위에 수행 될 수 있으므로 !을 사용하기 전에 모두 테스트해야합니다. 리팩터링 한 후에도 그 사실은 계속 유효합니까? 버그 수정 후? 모든 코드 변경에 대해?

nilif-let으로 테스트하는 것을 잊어 버린 경우 컴파일러에서 중지합니다. != nil으로 테스트하는 것을 잊어 버리면 충돌로 인해 중지됩니다. 잘하면 단위 테스트에서 운이 좋다면. 그다지 운이 좋지 않으면 현장에서.

즉, if-let은 좋은 메커니즘이 아닙니다. map 선택 사항 인 경우 nil coalescing (??), 선택 체인 (?.)을 사용할 수 있으며, 이들은 모두 버그를 피하기위한 훌륭한 도구입니다. 그러나 애플은 ! (유닉스에서 "뱅 (bang)"이라고 진지하게 불렀다)을 고의로 선택했다. 위험하며, 다른 옵션을 사용할 수없는 경우에만주의해서 사용해야합니다.

코드를 완벽하게 작성하면 컴파일러가 부과하는 안전성이 필요하지 않습니다. 어셈블러에 코드를 글로 z 메모리로 작성하고 우리가 사용하는 추상화 비용을 많이 피할 수 있습니다. 그러나 인간 프로그래머는 작은 실수를 많이하는 경향이 있으며, 그 이유는 사용자가 !을 피해야하는 이유입니다.