Swift 4和@objc警告

最近,我参与了一个迁移到Swift 4的项目,该项目在其代码库中混合了Swift 3和Objective-C。 因此,在接受来自Xcode 9的邀请以将项目转换/迁移到Swift 4之后,我遇到的第一件事是一个可怕的警告,说:

不建议在Swift 4模式下使用Swift 3 @objc推断。 请解决已弃用的@objc推断警告,启用“使用已弃用的Swift 3 @objc推断”日志记录来测试代码,然后通过将“ VarageSale”的“ Swift 3 @objc推断”构建设置更改为“默认”来禁用推断。目标。

@objc推论? WTF!

好的,这就是我所拥有的,正如您所知,Swift生成的代码仅对其他Swift代码可见/可用。 就像《猿人星球》电影中“猿不杀死猿”的扭曲版本一样。 因此,如果您有一个Swift类,要在Objective-C中使用哪些成员(函数,协议,变量),则需要通过使这些成员具有@objc属性来显式指示这些成员。

这是棘手的部分,在Swift 3中,编译器非常纵情,为某些类成员添加了@objc ,即使您可能不需要它。 但是在Swift 4中,在此问题上限制更大或更宽泛,因此我得到了警告(也可能是您)。

解决方案

1-使用@objc

就像我提到的,您可以使用@objc属性标记函数或属性, @objc会将标记的成员公开给Objective-C。

2-使用@ objcMembers

现在,如果要将所有类成员公开给Objective-C,则可以使用@objcMembers标记该类。

但是使用@objcMembers时要明智,因为由于需要在Swift和Objective-C之间映射的额外代码,它会使二进制文件更大。

参考文献

  • 迁移到Swift 4 @objc推断
  • 限制@objc推断