[英]How do you fetch a global constant using key-value coding in Swift?
我正在寫一個方法,該方法將給出CNPostalAddress元素的本地化名稱。 我嘗試檢索的本地化關鍵字是全局常量。
/// Get the localised name of a CNPostalAddress element
///
/// - Parameter field: CNPostalAddress element name (Street, SubLocality, City, SubAdministrativeArea, State, PostalCode, Country, ISOCountryCode)
/// - Returns: localized name of the address field
func localizedAddressFieldName(for field: String) -> String? {
let keyPathKey = "CNPostalAddress\(field)Key"
if let localizationKey = value(forKey: keyPathKey) as? String {
return CNPostalAddress.localizedString(forKey: localizationKey)
} else {
return nil
}
}
但是,使用以下日志獲取localizationKey
時,應用程序崩潰:
由於未捕獲的異常“ NSUnknownKeyException”而終止應用程序,原因:“ [<MyProject.MyViewController 0x7fd83d81c8b0> valueForUndefinedKey:]:此類不適用於密鑰CNPostalAddressStreetKey的密鑰值編碼兼容。”
如Apple docs所示, CNPostalAddressStreetKey
是有效的密鑰,但是全局常量。
解
extension CNPostalAddress {
class func localizedAddressFieldName(for field: String) -> String? {
let localizationKey = field.decapitalizingFirstLetter()
return CNPostalAddress.localizedString(forKey: localizationKey)
}
}
extension String {
func decapitalizingFirstLetter() -> String {
let firstLetterLowercase = String(prefix(1)).lowercased()
return firstLetterLowercase + String(dropFirst())
}
}
這是因為您可能不得不使用這些變量:
print("\(CNPostalAddress.localizedString(forKey: "subLocality"))")
print("\(CNPostalAddress.localizedString(forKey: "street"))")
所以代替
let keyPathKey = "CNPostalAddress\(field)Key"
你應該使用
let keyPathKey = "\(field)"
區分大小寫,因此您可能需要進行一些調整。
看這里
第一個value(forKey: keyPathKey)
是在NSKeyValueCoding
協議中定義的方法,您在viewController中調用該方法,這就是為什么崩潰以避免在您必須在ViewController
實現該方法而崩潰的原因
override func value(forKey key: String) -> Any? {
}
但無論如何,我認為您不必在一開始就調用此方法
func localizedAddressFieldName(for field: String) -> String? {
let localizationKey = "CNPostalAddress\(field)Key"
return CNPostalAddress.localizedString(forKey: localizationKey)
}
如果您的密鑰未在CNPostalAddress
定義,則結果將為空字符串
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.