Swift中UIApplication无法遵循URLOpenerProtocol协议的原因排查
报错原因
报错提示翻译:
类型
UIApplication不符合协议URLOpenerProtocol
两个方法签名看起来一致实际不匹配的核心原因:
- 你看到的两参数调用形式只是语法糖:UIApplication 原生并没有实现协议要求的、仅接收
url和completionHandler两个参数的open方法。日常能省略参数调用,是因为原生open是三参数方法,其中options参数带默认空值:
// UIApplication原生open方法的真实签名 func open( _ url: URL, options: [UIApplication.OpenExternalURLOptionsKey : Any] = [:], completionHandler: ((Bool) -> Void)? = nil )
调用时省略options参数是编译器自动补全默认值的效果,类本身不会因为参数带默认值就生成对应少参数的方法实现。
- Swift 校验协议遵循时做的是精确签名匹配,不会将带默认参数的方法判定为符合少参数的协议方法要求,哪怕两者的调用写法完全相同。
修复方式
在扩展中显式实现协议要求的方法,内部调用原生三参数方法即可:
extension UIApplication: URLOpenerProtocol { func open(_ url: URL, completionHandler: ((Bool) -> Void)?) { open(url, options: [:], completionHandler: completionHandler) } }
内容的提问来源于stack exchange,提问作者DevB1
相关产品推荐
相关产品推荐

