2015-01-04 1 views
4

info.plist 파일에 integer을 삽입했는데, 분명히 Swift UIViewController에서 검색하고 싶습니다.info.plist를 읽는 중 : 예기치 않은 문자가있는 AnyObject가있는 것으로 유추되었습니다.

class MyController: UIViewController { 

    private let value: Int 

    required init(coder aDecoder: NSCoder) { 

     if let info = NSBundle.mainBundle().objectForInfoDictionaryKey("v"){ 
      value = info.integerValue 
     }else{ 
      value = 0 
     } 

     super.init(coder: aDecoder) 
    } 

    //other auto-generated-methods 
    //... 

} 

옵션 AnyObject?를 반환 objectForInfoDictionaryKey 기능 및 이걸로 확인 해요 : 코드는 매우 간단합니다. 그러나 컴파일러는

상수 "정보"가 될 수 타입 AnyObject을 가지고 추론 나에게 말한다 예상치 못한 내가이 경고를 해결할 수 있습니다 왜 내가 함수가 그 사실에 대해 걱정해야하는 방법

AnyObject를 반환합니까? < - 이것은 물음표입니다 ... lol

AnyObject를 반환하더라도 객체가 nil이 아닌 경우 다운 캐스트 할 수 있습니다. 나는 왜 컴파일러가 이것에 대해 불평하는지 이해하지 못한다.

답변

12

엑스 코드는 일반적 AnyObject 또는 AnyObject? 같은 유추 를되는 변수에 대해 경고한다. (엑스 코드에서 알 수 있듯이) 당신은 경고 침묵하는 유형의 주석을 추가 할 수 있습니다

if let info : AnyObject = ... 

난 단지 추측 할 수 엑스 코드는 다음과 같이 동작하지만 하나의 이유는 당신은 알고 있어야 "강제"하는 수 있다는 이유 info이거나 개체 유형 일 수 있으며 예상 한 것일 수도 있습니다.

그래서 경우에도 info.integerValue개체가 예상되는 형태가 아닌 경우, 가 실행시에 충돌이 발생할 수 있습니다 컴파일합니다. 귀하의 경우 사전 값이 NSNumber 또는 NSString 이 아닌 경우 info.integerValue 예외가 발생합니다.

안전한 방법은 옵션으로 캐스팅하는 것입니다 :

if let info = NSBundle.mainBundle().objectForInfoDictionaryKey("v") as? NSNumber { 
    value = info.integerValue 
} else { 
    value = 0 
} 

NSNumber 사이의 자동 재 매핑 수행을 Int 당신은 쓸 수 또한

if let info = NSBundle.mainBundle().objectForInfoDictionaryKey("v") as? Int { 
    value = info 
} else { 
    value = 0 
} 

또는 액형으로 라이너는 nil-coalescing 연산자를 사용합니다. ?? :

+0

Perfect. 두 번째 해결책을 찾고 있었지만 세 번째 해결책은 매우 분명합니다. 고맙습니다. – superpuccio