Ios 处理基础对象抛出的异常?

Ios 处理基础对象抛出的异常?,ios,swift,ios8,optional-parameters,foundation,Ios,Swift,Ios8,Optional Parameters,Foundation,我有一个swift函数,可以从主捆绑包的localizedInfoDictionary中获取本地化的应用程序名称,其中包含一些备用案例 private func defaultAppName() -> String { var name: NSString = "" // Check for a localized version of the CFBundleDisplayName var mainBundle = NSBundle.mainBundle()

我有一个swift函数,可以从主捆绑包的
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
}
private func defaultAppName()->字符串{
变量名称:NSString=“”
//检查CbundleDisplayName的本地化版本
var mainBundle=NSBundle.mainBundle()
//这里的EXC\u访问错误,尽管有可选的
var mainbundleInfo字典:字典?=mainBundle.LocalizedInfo字典
如果让infoDictionary=mainBundleInfoDictionary{
name=infoDictionary[“CbundleDisplayName”]作为NSString
如果(name.length==0){
name=infoDictionary[kCFBundleNameKey]作为NSString
}
}
如果(name.length==0){
mainBundleInfoDictionary=mainBundle.infoDictionary
如果让infoDictionary=mainBundleInfoDictionary{
name=infoDictionary[“CbundleDisplayName”]作为NSString
如果(name.length==0){
name=infoDictionary[kCFBundleNameKey]作为NSString
}
}
}
返回名称
}
我知道它不简洁,但我仍在学习swift。我看到的问题是,访问
mainBundle.localizedInfoDictionary
在未找到时不会返回nil,而是抛出
EXC\u BAD\u访问
。我不能保证在使用此功能的应用程序中会有本地化的信息,但是处理选项的标准快捷方式在这里不起作用


我如何捕获NSBundle的
localizedInfoDictionary
调用引发的异常,或者调整我的swift代码以继续前进?

直接访问对象可能会让您幸运?至少在这样做时,我的操场表现更好(没有撞车):

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

我知道这并不能直接解决本地化问题。为了给出一个可行的建议,您只需在
本地化.strings中设置自己的(重复)键即可。首先,这是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"
}

目前似乎没有解决这个问题的办法。看看类似的问题,是的,我不认为有办法捕捉异常。我仍然对在不崩溃的情况下获得本地化名称感兴趣。这将是一些开源软件的一部分。我不能保证实现者将本地化他/她的AppThank!rdar://18332365In 在现代Swift中,
let name=
不会产生不明确的类型错误