2014-06-07 1 views
3

Swilift에서 nil 값에 대한 옵션을 확인하는 방법은 무엇입니까?Swift에서 nil에 대한 옵션 확인

JSON 구문 분석에 성공했는지 평가하려고합니다. 잘못된 json 전달 될 때 오류 메시지를 인쇄해야하지만 EXC_BAD_INSTRUCTION 함께 실패합니다.

func parseJson(data: NSData) { 
    var error: NSError? 
    var json: NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &error) as NSDictionary 
    if let err = error { 
     println("error parsing json") 
     return 
    } 
    println("json parsed successfully") 
} 

이 유효 JSON으로 실행 해보십시오 (잘 작동) :

parseJson(NSData(data: "{}".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true))) 

이 잘못된 JSON으로 시도 :

parseJson(NSData(data: "123".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true))) 

내가 선택적 개체 작업에 지점을 놓친 건가?

답변

6

오류가 발생하면 JSONObjectWithData가 nil을 반환하기 때문에 충돌이 발생합니다. 그런 다음 NSDictionary에 nil을 캐스팅하려고합니다. 작동 방식 :

func parseJson(data: NSData) { 
    var error: NSError? 
    var json : AnyObject! = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &error) 
    if let err = error { 
     println("error parsing json") 
     return 
    } 
    println("json parsed successfully") 
    var jsonDict = json as NSDictionary 
} 

원하는 경우 var json 유형을 NSDictionary로 전환 할 수 있습니까? 그래서 그것은 직접 nil을 처리합니다. 이렇게하려면 '?'을 추가하기 만하면됩니다. 는 "있는 그대로"그래서 키워드 :

func parseJson(data: NSData) { 
    var error: NSError? 
    var json: NSDictionary? = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &error) as? NSDictionary 
    if let err = error { 
     println("error parsing json") 
     return 
    } 
    // unwrap the optional value 
    if let jsonDictionary = json { 
     println("json parsed successfully") 
     // use the dictionary 
    } 
} 
+1

이 솔루션이 가장 적합하다고 생각합니다. 설계된대로 JSONObjectWithData API를 사용하며 가장 간결합니다. 암시 적으로 래핑되지 않은 선택 사항의 이점에 대한 좋은 예를 보여줍니다. – mbeaty

0

NSJSONSerialization.JSONObjectWithData 반환 값이 nil이 될 수 있다는 것을 의미하는 암시 적으로 래핑을 계속하는 옵션 값을 반환합니다. 유효하지 않은 JSON의 경우에는 선택적으로 nil 유형이 반환되었습니다. 따라서 var json은 nil 일 수 있으므로 선택적 유형이어야합니다. 더 나아가 var json이 선택적 유형 인 경우 ?as 옆에 추가하여 선택 사항으로 다운 캐스트해야합니다. 이것은 내가 코드 비트를 재구성 최종 결과

var json: NSDictionary? = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &error) as? NSDictionary 
1

입니다 :

func parseJson(data: NSData) { 
    var error: NSError? 
    var json: AnyObject? = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &error) 
    if let jsonDict: NSDictionary = json as? NSDictionary{ 
     println("json parsed successfully") 
     //do something with the nsdictionary... 
    } 
    else{ 
     println("error parsing json") 
    } 

} 
parseJson(NSData(data: "{}".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true))) 
parseJson(NSData(data: "123".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true))) 

문제 아니었다와는 한 때 방법을 코드 만하고 JSON있는 NSDictionary가 아닌 경우 실패합니다. 또한이 코드는 오류 자체를 검사하는 대신 NSDictionary가 반환되었는지 검사합니다.

0

NSDictionary 유형 캐스팅을 옵션으로 만들 때까지 fatal error: unexpectedly found nil while unwrapping an Optional value을 얻었습니다. as? NSDictionary 대신 as Dictionary

관련 문제