簡體   English   中英

如何在Swift中使用鍵值編碼獲取全局常量?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM