为什么我们可以在协议扩展中提供变量实例?

时间:2018-05-18 14:45:40

标签: swift4 swift-protocols swift-extensions

为什么我们可以在协议扩展中为变量提供实例,而我们却无法在协议本身中为变量提供实例?

在协议中,我不能给出一个变量新实例,但是当我从这个协议扩展时,我可以为变量创建一个新实例......我不知道为什么 我认为协议的扩展将像协议本身一样,但事实并非如此。而类扩展的行为类似于类本身。

As we can see in the image, we can't give variable instance but we can do it in the extension

1 个答案:

答案 0 :(得分:2)

protocol声明一个抽象接口。协议的扩展声明了默认实现。

某些编程语言的表现方式不同(例如default中带有interface关键字的Java,但这是Swift的语法决定。

在Swift中将默认实现移动到扩展名的原因是因为扩展可以具有类型约束,因此您可以针对不同类型使用不同的默认实现。

例如:

protocol ErrorDisplaying {
    func showError(message: String)
}

extension ErrorDisplaying where Self: UIViewController {
   func showError(message: String) {
     let alert = UIAlertController(title: nil, message: message, preferredStyle: .alert)
     present(alert, animated: true, completion: nil)
   }
}