con*_*are 2 optional-parameters foundation ios swift ios8
我有一个快速的功能来从主要包中获取本地化的应用程序名称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
}
Run Code Online (Sandbox Code Playgroud)
我知道这不简洁,但我仍在学习.我看到的问题是访问mainBundle.localizedInfoDictionary没有找到时返回nil,而是抛出一个EXC_BAD_ACCESS.我不能保证在使用此功能的应用程序中会有本地化信息,但处理选项的标准快捷方式在这里不起作用.
我怎样才能捕获NSBundle localizedInfoDictionary调用抛出的异常或调整我的swift代码继续前进?
首先,这是Swift中的一个错误,应该报告给bugreport.apple.com.此方法用于返回隐式可选.他们应该将它转换为显式可选,但是将其转换为非可选,因为该方法可以返回nil:
NSDictionary *mainBundleInfoDictionary = [[NSBundle mainBundle] localizedInfoDictionary];
NSLog(@"%@", mainBundleInfoDictionary);
Run Code Online (Sandbox Code Playgroud)
但是你通常不需要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"
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
909 次 |
| 最近记录: |