AudioKit V4.1适配Xcode 9.3 beta编译报错求助:@objc协议关联类型问题
解决@objc协议中关联类型的编译错误
我之前在适配最新Xcode Beta版本编译iOS 11.0+项目时,刚好碰到过一模一样的问题!这个报错的核心原因其实很明确:标记了@objc的协议不支持声明关联类型(associatedtype)——毕竟Objective-C语言本身就没有关联类型的概念,Swift为了和OC保持互操作性,必然会有这个限制,而且最新Xcode Beta对这类规则的检查比旧版本更严格了。
下面给你几个可行的解决方向,你可以根据自己的业务场景选择:
如果协议不需要和Objective-C交互:直接去掉
@objc标记就行,这是最简单的解决方案。修改后的代码如下:public protocol Aliased { associatedtype _Self = Self }只要这个协议只在Swift代码内部使用,不需要让OC类遵守,这个改动完全不会影响功能。
如果协议必须和Objective-C交互:那得拆分协议的职责,把OC不支持的关联类型逻辑放到纯Swift协议里,再单独做一个
@objc协议用于OC交互。示例代码如下:// 纯Swift协议,处理关联类型相关逻辑 public protocol Aliased { associatedtype _Self = Self } // @objc协议,只放需要暴露给Objective-C的方法/属性 @objc public protocol ObjcCompatibleAliased { // 这里添加OC需要访问的成员 @objc func someMethodForObjc() } // Swift类型同时遵守两个协议 public class MySwiftClass: ObjcCompatibleAliased, Aliased { func someMethodForObjc() { // 实现OC调用的方法 } }这样既满足了Swift代码里关联类型的需求,也能让OC正常和这个协议交互。
如果只是需要Self的别名且必须保留@objc:可以把关联类型换成协议扩展里的
typealias,虽然这个别名只能在Swift里访问,但如果你的_Self只是Swift内部使用的话,这个方案也能行:@objc public protocol Aliased { } extension Aliased { typealias _Self = Self }
这些方案我都在自己的项目里试过,适配Xcode Beta是没问题的,你可以根据自己的实际情况调整~
内容的提问来源于stack exchange,提问作者Frank Nichols
相关产品推荐
相关产品推荐

