我正在看一个教程,我注意到作者扩展了他们的协议叫做Activity,并在代码中写了函数的主体。这确实可以编译,但是我的印象是协议仅显示方法签名,或者如果协议确实实现了主体,则它将是一个变异函数。下面的代码未在其功能之一上使用mutating,但它仍然可以运行并且工作!有人可以解释这种现象或确认协议扩展可以具有方法主体吗?
slow query log
答案 0 :(得分:2)
在Swift中,扩展允许您提供协议的默认实现。
根据Swift关于协议的文档,
可以扩展协议以提供方法,初始化程序,下标, 以及将属性实现计算为符合标准的类型。这允许 您可以定义协议本身的行为,而不是每个协议 类型的个人符合性或全局功能。
答案 1 :(得分:1)
In Swift, does a protocol extension allow function bodies?
是的。这是将特定功能仅添加到某些协议实例的一种非常方便的方法。考虑一下:
protocol Flying {
func useWings()
}
extension Flying {
func fly() {}
}
class Animal {}
class Bird: Animal {}
extension Bird: Flying {
func useWings() {}
}
let bird = Bird()
bird.fly()
这也使这里有些逻辑。如果某物可以使用机翼,那么它也可能会飞翔。因此,当我们扩展Bird
来实现Flying
并实现useWings
时,它现在也可以运行了。
The code below doesn't use mutating on one of its functions but it still runs and WORKS! Can someone explain the phenomena
Mutating关键字表示该函数将改变其调用的值。如果您的协议不是类(protocol Some: class {}
),则必须明确地说出来。 createCareKitActivity()
不会自我变异,因此您不必指定mutating
答案 2 :(得分:0)
Class -> Protocol -> Extension
Swift的protocol extension
允许您的类通过其他或默认功能进行操作