@objc 之后调用的所有代码都需要符合 Objective-C 吗?
Posted
技术标签:
【中文标题】@objc 之后调用的所有代码都需要符合 Objective-C 吗?【英文标题】:does all the code called after @objc need to be Objective-C compliant? 【发布时间】:2018-11-28 12:14:04 【问题描述】:当我使用#selector 将函数作为目标添加到UIButton 时,我应该将其标记为@objc,这没关系。但问题是@objc 函数调用的每个函数和方法都必须符合Objective-C,否则应用程序崩溃。
例如,当我使用 Swift 枚举(我也将该枚举声明为 @objc)时,它会因此错误而崩溃 unrecognized selector sent to instance
这是使用@Objc 的预期行为,还是我做错了什么?
如果是,是否有解决方法,或者我应该让 @objc 调用的所有内容都符合 Objective-C 标准(在某些情况下,我需要重新编写一大堆代码)?
【问题讨论】:
如何确定“发送到实例的无法识别的选择器”崩溃是因为“@objc”。如果“@objc”有任何问题,我相信编译器不会允许你运行你的代码,也不会有任何运行时错误。因此,您的现金可能在不同的地方,或者您的方法名称可能不匹配。如果可能,还请显示您的代码。@IBAction
。 @objcMembers
.
这不是预期的。你在做不正确的事情。请创建一个 mcve 来展示您所描述的内容 (***.com/help/mcve)
代码很大,我正在尝试将其减少为仅导致崩溃的部分。
【参考方案1】:
@objc 属性使您的 Swift API 在 Objective-C 和 Objective-C 运行时中可用。
在 Swift 4 版本发布后,很少有 @objc 的推理案例被移除。这意味着在少数其他情况下,在 Swift 编译器推断出 @objc 标头之前,在 Swift 4 中不会推断出。
因此,通过这种情况,您现在可以了解导致问题的原因以及如何使用@objc。
确保您使用的是 swift 语言版本 4 或更新版本。从目标 -> 构建设置中找到 Swift 语言版本以查看您使用的版本。
希望对你有帮助。
【讨论】:
【参考方案2】:在对代码进行了大量试验后,我注意到问题在于将自定义对象保存到 UserDefaults,而没有使用 NSKeyedArchiver 对其进行归档。
【讨论】:
以上是关于@objc 之后调用的所有代码都需要符合 Objective-C 吗?的主要内容,如果未能解决你的问题,请参考以下文章
Groovy集合遍历 ( 调用集合的 every 方法判定集合中的所有元素是否符合闭包规则 | =~ 运算符等价于 contains 函数 | 代码示例 )