Swift中键值编码获取全局常量失败及CNPostalAddress本地化问题
解决CNPostalAddress本地化名称获取时的NSUnknownKeyException崩溃问题
我来帮你梳理下这个问题的根源和解决办法:
你最初的代码尝试用value(forKey:)去获取CNPostalAddressStreetKey这类全局常量,但value(forKey:)是KVC(键值编码)方法,它只会在当前类(这里是你的MyViewController)的属性列表里查找对应键,而CNPostalAddressStreetKey是系统定义的全局字符串常量,根本不属于当前类的KVC兼容属性,所以必然会抛出NSUnknownKeyException崩溃。
修正后的解决方案
我们可以换个更直接的思路:CNPostalAddress.localizedString(forKey:)接受的参数,其实就是对应字段名的首字母小写形式(比如CNPostalAddressStreetKey的实际值就是"street")。基于这个规律,我们可以通过字符串转换直接得到正确的本地化键,完全不需要依赖KVC:
extension CNPostalAddress { class func localizedAddressFieldName(for field: String) -> String? { // 将传入的字段名首字母小写,得到对应的本地化键 let localizationKey = field.decapitalizingFirstLetter() return CNPostalAddress.localizedString(forKey: localizationKey) } } // 给String添加首字母小写的扩展方法 extension String { func decapitalizingFirstLetter() -> String { let firstLetterLowercase = String(prefix(1)).lowercased() return firstLetterLowercase + String(dropFirst()) } }
用法示例
比如你要获取街道的本地化名称,直接调用:
let streetName = CNPostalAddress.localizedAddressFieldName(for: "Street")
这样就能正确返回对应语言环境下的街道名称了,而且不会再触发崩溃。
内容的提问来源于stack exchange,提问作者NSGoat
相关产品推荐
相关产品推荐

