在Swift中,协议扩展是否允许功能主体?

时间:2018-10-13 03:23:59

标签: swift swift-protocols swift-extensions

我正在看一个教程,我注意到作者扩展了他们的协议叫做Activity,并在代码中写了函数的主体。这确实可以编译,但是我的印象是协议仅显示方法签名,或者如果协议确实实现了主体,则它将是一个变异函数。下面的代码未在其功能之一上使用mutating,但它仍然可以运行并且工作!有人可以解释这种现象或确认协议扩展可以具有方法主体吗?

slow query log

3 个答案:

答案 0 :(得分:2)

在Swift中,扩展允许您提供协议的默认实现。
根据Swift关于协议的文档,

  

可以扩展协议以提供方法,初始化程序,下标,   以及将属性实现计算为符合标准的类型。这允许   您可以定义协议本身的行为,而不是每个协议   类型的个人符合性或全局功能。

来源:Swift Documentation

答案 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允许您的类通过其他或默认功能进行操作