【问题标题】:Case-insensitive 'responds to selector' in SwiftSwift 中不区分大小写的“响应选择器”
【发布时间】:2018-01-31 14:29:08
【问题描述】:

我从推送通知中获取了一些键和值。然后我想检查键是否是对象的属性,因此我可以相应地映射对象。但我希望能够使用小写键并且对象属性是驼峰式的。

所以问题是如何在 Swift 4 中实现一个不区分大小写的 NSObject 版本:

self.responds(to: Selector(value))

【问题讨论】:

  • 你尝试过覆盖responds(to:)吗?
  • 选择器区分大小写。 allUsersallusers 不同,因此您询问是否可以通过询问选择器 B 来检查对象是否响应选择器 A。您可以使用 Objective C 运行时进行此检查,但您不应该这样做,并且这并不容易,也不值得。
  • 您可以将字典键转换为驼峰式。尽管您可能需要一些高级启发式方法才能使其正确。或者,您可以将推送通知中的键映射到它们的驼峰式变体。
  • 你可以像stackoverflow.com/a/24845527/5329717这样枚举属性并结合Caleb的方法

标签: swift respondstoselector


【解决方案1】:

但我希望能够使用小写键并且对象属性是驼峰式的。

这里的问题是当你从camelCase转换为小写时你会丢失信息,所以你不能轻易地转换到另一个方向。

您需要构建一个将键映射到选择器的字典。尽管 Swift 有一些 limited facilities for introspection,但手动创建字典并仅包含您希望参与此过程的那些属性可能是最简单的:

let properties : [String] = ["firstName", "lastName", "address", "zipCode"]
var map = [String:String]()
properties {
    map[$0.lowercased()] = $0
}

现在您可以使用map 查找给定键的属性名称。

【讨论】:

    猜你喜欢
    • 2014-05-24
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    • 2011-11-25
    • 2013-10-28
    • 1970-01-01
    • 2011-08-05
    • 2012-09-06
    相关资源
    最近更新 更多