首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Swift中的键值编码获取全局常量?

如何使用Swift中的键值编码获取全局常量?
EN

Stack Overflow用户
提问于 2018-01-19 13:56:00
回答 2查看 235关注 0票数 1

我正在编写一个方法,它将给出CNPostalAddress元素的本地化名称。我试图检索的本地化键是全局常量。

代码语言:javascript
复制
/// 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时,应用程序会崩溃:

终止应用程序,原因是:“ valueForUndefinedKey::该类不符合键CNPostalAddressStreetKey的键值编码。”

CNPostalAddressStreetKey是一个有效的键,如苹果文档所示,但它是一个全局常量。

溶液

代码语言:javascript
复制
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())
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-19 14:15:20

这是因为您可能不得不使用这些变量来代替:

代码语言:javascript
复制
print("\(CNPostalAddress.localizedString(forKey: "subLocality"))")
print("\(CNPostalAddress.localizedString(forKey: "street"))")

因此,不是

代码语言:javascript
复制
let keyPathKey = "CNPostalAddress\(field)Key"

你应该使用

代码语言:javascript
复制
let keyPathKey = "\(field)"

这是区分大小写的,所以你可能需要做一些调整。

请参阅这里

票数 0
EN

Stack Overflow用户

发布于 2018-01-19 14:16:57

首先,value(forKey: keyPathKey)是在NSKeyValueCoding协议中定义的方法,您正在viewController中调用该方法,这就是为什么要避免崩溃,您必须在ViewController中实现该方法。

代码语言:javascript
复制
override func value(forKey key: String) -> Any? {

}

,但无论如何,我认为您不需要在第一次实例中调用此方法

代码语言:javascript
复制
func localizedAddressFieldName(for field: String) -> String? {
    let localizationKey = "CNPostalAddress\(field)Key"

    return CNPostalAddress.localizedString(forKey: localizationKey)
}

如果您的键没有在CNPostalAddress中定义,则结果将是一个空字符串。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48342703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档