为什么可以快速将一个类分配给它的扩展名?

时间:2018-11-28 23:16:21

标签: ios swift

下面是代码

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?

  • WWDC 2017 _engineering_for_testability的代码

1 个答案:

答案 0 :(得分:0)

通过扩展UIApplication并使该扩展符合URLOpening,您将使UIApplication的每个实例都具有该构想。

当您声明属性为协议类型(在本例中为URLOpening)时,该属性将接受符合该协议的任何对象。