gpt4 book ai didi

ios - 处理 Foundation 对象抛出的异常?

转载 作者:可可西里 更新时间:2023-11-01 00:24:27 25 4
gpt4 key购买 nike

我有一个 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
}

我知道它不简洁,但我仍在快速学习。我看到的问题是访问 mainBundle.localizedInfoDictionary 未找到时不返回 nil,而是抛出 EXC_BAD_ACCESS。我不能保证在使用此功能的应用程序中会有本地化信息,但处理可选值的标准快速方式在这里不起作用。

如何捕获 NSBundle 的 localizedInfoDictionary 调用抛出的异常或调整我的 swift 代码以继续?

最佳答案

首先,这是 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"
}

关于ios - 处理 Foundation 对象抛出的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25836247/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com