下面是代码
protocol URLOpening {
func canOpenURL(_ url: URL) -> Bool
func open(_ url: URL, options: [String: Any], completionHandler: ((Bool) -> Void)?)
}
extension UIApplication: URLOpening {
}
执行此操作后,可以执行以下操作:
class DocumentOpener {
let urlOpener: URLOpening
init(urlOpener: URLOpening = UIApplication.shared) {
self.urlOpener = urlOpener
}
/* … */
}
urlOpener的两个功能与UIApplication的相同。使用urlOpener.canOpenURL和urlOpener.open
我的问题是:为什么可以将UIApplication.shared分配给URLOpening,在代码中,我们将UIApplication扩展为遵循URLOpening?
答案 0 :(得分:0)
通过扩展UIApplication并使该扩展符合URLOpening,您将使UIApplication的每个实例都具有该构想。
当您声明属性为协议类型(在本例中为URLOpening)时,该属性将接受符合该协议的任何对象。