2014-09-14 8 views
2

일부 대체 케이스를 사용하여 주 번들의 localizedInfoDictionary에서 현지화 된 앱 이름을 신속하게 가져올 수 있습니다.Foundation 개체에서 처리하는 예외 처리?

private func defaultAppName() -> String { 
    var name: NSString = "" 
    // Check for a localized version of the CFBundleDisplayName 
    var mainBundle = NSBundle.mainBundle() 
    // EXC_BAD_ACCESS HERE, despite the optional 
    var mainBundleInfoDictionary: Dictionary<NSObject, AnyObject>? = mainBundle.localizedInfoDictionary 

    if let infoDictionary = mainBundleInfoDictionary { 
     name = infoDictionary["CFBundleDisplayName"] as NSString 

     if (name.length == 0) { 
      name = infoDictionary[kCFBundleNameKey] as NSString 
     } 
    } 

    if (name.length == 0) { 
     mainBundleInfoDictionary = mainBundle.infoDictionary 

     if let infoDictionary = mainBundleInfoDictionary { 
      name = infoDictionary["CFBundleDisplayName"] as NSString 

      if (name.length == 0) { 
       name = infoDictionary[kCFBundleNameKey] as NSString 
      } 
     } 
    } 

    return name 
} 

나는 그것이 간결하지 않다는 것을 알고있다, 그러나 나는 아직도 신속한 배우고있다. 내가보고있는 문제는 mainBundle.localizedInfoDictionary에 액세스하는 것이 찾지 못할 때 nil을 반환하지 않고 오히려 EXC_BAD_ACCESS을 던지는 것입니다. 이 기능이 사용되는 앱에 현지화 된 정보가 있다는 것을 보장 할 수는 없지만 표준 옵션을 신속하게 처리하는 방법은 여기서 작동하지 않습니다.

NSBundle의 localizedInfoDictionary 호출에 의해 throw 된 예외를 잡아 내거나 이동하기 위해 신속한 코드를 적용하려면 어떻게해야합니까?

+0

현재이 문제에 대한 해결책이없는 것으로 보입니다. 유사한 문제는 http://stackoverflow.com/questions/24710424/catch-an-exception-for-invalid-user-input-in-swift를 참조하십시오. http://stackoverflow.com/questions/24023112/try- 신속한 catch-catchions. –

+0

그래, 나는 예외를 잡을 방법이 있다고 생각하지 않았다. 나는 여전히 충돌없이 지역화 된 이름을 얻는 것에 관심이있다. – coneybeare

답변

6

먼저 Swift의 버그이며 bugreport.apple.com에보고해야합니다. 이 메소드는 암시 적 (implicit) 옵션을 리턴하는 데 사용됩니다. 그들은 명시 적 선택으로 변환하지만, 방법은 nil를 반환 할 수 있기 때문에, 대신에 비 선택적으로 변환해야 :

NSDictionary *mainBundleInfoDictionary = [[NSBundle mainBundle] localizedInfoDictionary]; 
NSLog(@"%@", mainBundleInfoDictionary); 

을하지만 일반적으로 localizedInfoDictionary 필요하지 않습니다. NSBundle으로 직접 문의하십시오.

private func defaultAppName() -> String { 
    let mainBundle = NSBundle.mainBundle() 
    let displayName = mainBundle.objectForInfoDictionaryKey("CFBundleDisplayName") as? String 
    let name = mainBundle.objectForInfoDictionaryKey(kCFBundleNameKey) as? String 
    return displayName ?? name ?? "Unknown" 
} 
+0

고마워요! rdar : // 18332365 – coneybeare

+0

현대적인 Swift에서'let name ='은 모호한 타입 에러를 생성하지 않습니다. –

0

아마도 개체에 직접 액세스하여 행운이 올 것입니까?

let name = mainBundle.objectForInfoDictionaryKey("CFBundleDisplayName") as? String 

을 나는이 직접 현지화 문제를 해결하지 않습니다 알고 : 적어도 나는 이런 식으로 일을 할 때 놀이터 (충돌없이) 잘 작동했다. 실행 가능한 제안을하기 위해 Localizable.strings에 자신 만의 (중복) 키를 만들 수도 있습니다.

+0

이것은 오픈 소스 소프트웨어의 일부입니다. 구현자가 자신의 앱을 현지화했다는 것을 보장 할 수는 없습니다 – coneybeare