处理Foundation对象抛出的异常?

时间:2014-09-14 17:54:09

标签: ios swift ios8 optional-parameters foundation

我有一个快速的功能,可以从主要包localizedInfoDictionary获取本地化的应用名称,并附带一些后备案例。

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调用引发的异常或调整我的快速代码继续前进?

2 个答案:

答案 0 :(得分:6)

首先,这是Swift中的一个错误,应该报告给bugreport.apple.com。此方法用于返回隐式可选。他们应该将它转换为显式可选,但是将其转换为非可选,因为该方法可以返回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"
}

答案 1 :(得分:0)

也许你直接访问对象会很幸运?至少我这样做时Playground表现得更好(没有崩溃):

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

我知道这并没有直接解决本地化问题。要提供可操作的建议,您可以在Localizable.strings中创建自己的(重复)密钥。