Swift中的协议和实际示例
协议定义了适合特定任务或功能的方法,属性和其他要求的蓝图。 然后,该协议可以由类,结构或枚举采用,以提供这些要求的实际实现。 满足协议要求的任何类型都被称为符合该协议。
因此,为了简单起见,一个协议会说一个struct,class或enum,如果您想成为那个,请执行this,this和This。 示例:如果您想成为一名开发人员,则必须阅读并编写代码。
协议创建和采用
我们可以创建如下的Protocol
:
协议SomeProtocol {
//协议定义在这里
}
类,结构和枚举可以采用这些协议,方法是将协议名称放在类型名称之后,并用冒号分隔,作为其定义的一部分。 可以列出多个协议,并用逗号分隔。
struct SomeStruct:FirstProtocol,SecondProtocol {
//结构定义在这里
}
如果一个类具有超类,请在其采用的任何协议之前列出超类名称,后跟逗号。
class SomeClass:SomeSuperClass,FirstProtocol,AnotherProtocol {
//类定义在这里
}
示例一:财产要求
上面的协议只是说要采用我的任何类/结构/枚举必须具有一个名为fullName
的属性,该属性必须是String
的类型,并且该属性必须是一个用{get}表示的gettable属性 。
第First Implementation
和Second Implementation
都有一个名为fullName
的属性,因此尽管它们具有不同的实现,但它们都符合FullNameable protocol
。 我们的FullNameable
协议说的是,我们需要有一个fullName
属性,它没有说明我们应该如何获取此属性。 等等,那么什么使属性可gettable
呢?
gettable属性是一个只有赋予初始值后才能读取的属性。
当我们尝试为fullName
属性分配新值时,由于初始化Lecturer结构时使用了let
关键字,它将失败。
该示例的原因是:
- 展示如何使用协议并遵守该协议
- 让我们理解,符合属性的类不必具有相同的实现。
- 了解
{ get }
代表什么
示例二:连接松散的最终类别
让我们假设我们要制作冰沙,而制作冰沙所需的要求是Milk
和Dairy
。 做冰沙,我们必须混合一些水果以及一些乳制品。 因此,我们将需要一个混合方法,所有制作冰沙的类都必须具有此方法,因此我们必须使用如下所示的协议来实施此方法
要制作冰沙,我们需要在每个符合Blendable协议的类上调用blend方法,我们可以实现
makeSmoothie方法将接受符合Blendable协议的类的数组,然后使用for循环访问每个类中的blend方法。 如果将不符合Blendable协议的类作为数组传递,则应用程序将引发错误。
该示例的原因是:
- 展示如何使用方法作为协议要求
- 了解如何访问符合协议的松散终端类
示例三:何时使用协议
一个问题是决定何时使用protocol
对class inheritance
进行class inheritance
。 确定何时使用protocol
与class inheritance
进行比较的最好秘诀是知道何时确定类之间的关系类型。 是IS-A
关系还是HAS-A
。
IS-A
关系是一种关系,其中孩子将拥有父母拥有的所有东西以及其他属性。 一个很好的例子是飞机和喷气飞机。 JetPlane is basically an Airplane
具有其他属性/方法JetPlane is basically an Airplane
HAS-A
关系是HAS-A
关系类型,其中两个类不相同,但共享相似的属性/方法。 一个很好的例子是鸟和飞机。 鸟可以像飞机一样飞行。 这是使用协议的最佳时间。
该示例的原因是:
- 显示何时在类继承上使用协议
示例四:协议继承
协议可以继承一个或多个其他协议,并且可以在继承的要求之上添加其他要求。 协议继承的语法类似于类继承的语法,但是可以选择列出多个继承的协议,并用逗号分隔:
继承Pet
协议的任何类/结构/枚举也必须符合Animal
协议,因为Pet
协议是从Animal
协议继承的。