Swift中符合协议要求的实例方法报“几乎匹配可选要求”警告如何解决
问题原因及修复方案
这个警告出现的核心原因是现有项目中存在类型命名冲突或者全局自定义别名覆盖了系统类型,和Xcode本身的索引无关,几种常见场景和修复方式如下:
- 第一种:检查项目中是否自定义了同名的
UIApplication、NSUserActivity、UIUserActivityRestoring类型,或者定义了全局的typealias覆盖了上述系统类型
比如如果你的项目里有个叫NSUserActivity的自定义struct/enum,或者写过typealias UIUserActivityRestoring = Any这类全局别名,就会导致方法签名和系统协议要求的签名不匹配,自然会被判定为不匹配协议
排查方式:按住Command点击方法里的每一个参数类型,看跳转的是系统UIKit/Foundation的头文件,还是你项目里的自定义文件,找到冲突的自定义类型后改名即可 - 第二种:检查项目的Swift版本配置是否和新建空白项目不一致
不同Swift版本对协议方法的参数标签、转义修饰符要求有细微差异,比如旧Swift版本中restorationHandler的参数不需要@escaping,或者Swift 5以后对可选协议的匹配规则有调整
排查方式:打开项目的Build Settings,搜索Swift Language Version,确认和你新建空白项目的Swift版本一致即可 - 第三种:检查是否导入了包含同名扩展/方法的第三方库
部分第三方库可能会给AppDelegate添加扩展,或者自定义了同名的协议方法,会干扰Xcode的协议匹配判定
排查方式:把该方法前加上@objc明确标注匹配Objective-C的协议方法,或者直接指定方法的ObjC选择器:
手动指定选择器后会强制匹配系统@objc(application:continueUserActivity:restorationHandler:) func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool { // 你的实现代码 }UIApplicationDelegate的对应方法,警告会直接消失 - 第四种:清理Xcode缓存与派生数据
极少数情况是Xcode的派生数据缓存了旧的索引信息,执行以下操作即可:- 关闭Xcode
- 执行命令
rm -rf ~/Library/Developer/Xcode/DerivedData - 重新打开项目等待索引完成
内容的提问来源于stack exchange,提问作者user1532080
相关产品推荐
相关产品推荐

