为什么我们可以在协议扩展中为变量提供实例,而我们却无法在协议本身中为变量提供实例?
在协议中,我不能给出一个变量新实例,但是当我从这个协议扩展时,我可以为变量创建一个新实例......我不知道为什么 我认为协议的扩展将像协议本身一样,但事实并非如此。而类扩展的行为类似于类本身。
As we can see in the image, we can't give variable instance but we can do it in the extension
答案 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)
}
}