引用: “在Swift 4模式下使用Swift 3 @objc推断已被弃用。请处理已弃用的@ objc推断警告,使用“使用已弃用的Swift 3 @ objc推断”记录启用测试代码,并禁用Swift 3 @ objc推断。”
经过一番调查,我仍然不知道如何解决这个问题。非常感谢任何关于如何解决此问题以及对发生的事情的解释的提示。
我的目标是更好地理解我的代码正在发生什么。
@objc
推断已经被弃用。请解决所有弃用的@objc
推断警告,测试您的代码并启用“使用已弃用的Swift 3 @objc
推断”的日志记录,并禁用Swift 3 @objc
推断。”你知道在哪里启用所述的Swift 3 @objc
推断日志记录吗? - 0x416e746f6e@objc
推断?它是怎样工作的?在Swift 3
中,编译器会在许多地方自动推断添加@objc
,因此您不需要手动添加。换句话说,它会为您添加@objc
!
但在Swift 4
中,编译器不再像以前那么自动推断添加了。现在您必须显式地添加@objc
。
默认情况下,在Swift 4之前的项目中,您会收到有关此事的警告。在Swift 4项目中,您将收到构建错误。这是通过SWIFT_SWIFT3_OBJC_INFERENCE
构建设置来控制的。在Swift 4前的项目中,此设置为On
。强烈建议将其设置为Default
(或Off
),这是新项目的默认选项。
转换所有内容需要一些时间,但由于它是Swift 4的默认设置,所以值得这样做。
有两种方法可以转换您的代码,使编译器不再抱怨。
一种方法是在需要暴露给Objective-C运行时的每个函数或变量上使用@objc
:
@objc func foo() {
}
另一种方法是在 Class
声明中使用 @objcMembers
。这将确保自动向类中的所有函数和变量添加 @objc
。 这是一种简单的方法,但是它有一个代价,例如它可能通过暴露不需要暴露的函数来增加应用程序的大小。
@objcMembers class Test {
}
@objc
,为什么需要它?如果你在 Swift 类中引入了新的方法或变量,并将它们标记为 @objc
,则会将它们暴露给 Objective-C 运行时。这在你的 Swift 类被 Objective-C 代码使用时非常必要,或者当你正在使用像 Selectors
这样的 Objective-C 特性时也是必须的。例如,目标-动作模式:
button.addTarget(self, action:#selector(didPressButton), for:.touchUpInside)
@objc
?将某些内容标记为 @objc
也有其负面影响:
请记住,这只是一个非常简单的概述,实际情况比我写的更加复杂。我建议阅读实际的提案以获取更多信息。
@objc
不意味着动态分派,Swift 可以自由使用静态或虚拟分派(并可能因此执行不同的代码)。dynamic
关键字是强制 Swift 使用动态分派的必要条件。 - kevin@objc
被弃用了,我们应该使用什么? - AznixSWIFT_SWIFT3_OBJC_INFERENCE
设置为“On”。首先转换为 Swift 4,然后处理 @objc
相关内容。为了简化操作,请遵循基本规则:如果 Swift 类在 Objc-C 代码中使用(通过桥接头文件),请使用 @objcMembers
;否则,请逐个添加 @objc
。可以使用 Xcode 搜索查找任何 .m
文件中是否调用了 Swift 类。这应该使转换相对轻松。 - kgaidis@objc
在Swift 4中发生了变化,然后再做出决定来修复项目并保持其原样。 - derpoliuk我在使用“Swift 3 @objc 推断” = “默认”设置时遇到了这个警告。后来我意识到这是针对整个项目而不是目标设定的。因此,请确保您的目标中有“默认”设置以消除警告。
实际上,您可以通过禁用Swift 3 @objc推断来摆脱这些警告。 然而,可能会出现一些微妙的问题。例如,KVO将停止工作。 在Swift 3下,此代码完美运行:
for (key, value) in jsonDict {
if self.value(forKey: key) != nil {
self.setValue(value, forKey: key)
}
}
第一步,进入Build Setting
在Build Setting中搜索Inference
更改swift 3 @objc Inference为Default
func call(){
foo()
}
@objc func foo() {
}