0
点赞
收藏
分享

微信扫一扫

Swift实用小册20: Protocol协议的使用

在本章中,你将学会​​Protocol​​协议的使用方法。

前言

和​​Apple​​​官网或者网上分享的教程类文章不同,我将以实际开发角度讲述​​Swift​​​语言的一些概念和用法,方便大家更好地学习和掌握​​Swift​​语言。

这同时也是对自己学习​​Swift​​语言过程的知识整理。

如有错误,以你为准。

项目创建

我们新建一个​​SwiftUI​​​项目,命名为​​SwiftUIProtocol​​。

Swift实用小册20: Protocol协议的使用_控制流

协议的定义

协议,规定了用来实现某一特定功能所必需的方法和属性。

协议提供具体实现来完成协议定义的方法和功能,可以用在​​class​​​类、​​Struct​​​结构体、​​enum​​枚举类型上,我们一般叫做某某“遵循”什么协议

协议的示例

在​​Swift​​​开发过程中,我们常常会使用到​​MVC、MVVM​​​开发模式,其中​​Model​​部分,常常伴随着协议的定义。示例:

import SwiftUI

struct Model: Identifiable {
var id = UUID()
var title: String
var placehoder: String
}

var Models = [
Model(title: "基础部分", placehoder: "常量和变量的使用"),
Model(title: "基础运算符", placehoder: "基础运算符的使用"),
Model(title: "字符串和字符", placehoder: "字符串的使用"),
Model(title: "集合类型", placehoder: "集合类型的使用"),
Model(title: "控制流", placehoder: "控制流的使用")
]

Swift实用小册20: Protocol协议的使用_控制流_02

上述代码中,我们创建了一个​​Model​​​结构体,它遵循​​Identifiable​​协议。

​Identifiable​​协议,可以为类或值类型提供稳定的身份概念,这样我们就可以在​​View​​​视图中使用由​​UUID()​​​确定的​​唯一id​​的数据。

我们声明了​​3​​​个变量:​​id、title、placehoder​​​,然后创建了一个数组变量​​Models​​并赋予了一些示例数据。

由于我们​​Model​​​结构体遵循​​Identifiable​​​协议,因此哪怕我们数组​​Models​​​内的数据是完全一样的,由于​​Identifiable​​协议保证在对象的生存期内保持唯一,它也会被系统定义为​​2条​​。

我们在​​View​​​视图中使用​​List​​​列表和​​ForEach​​循环遍历数组数据,示例:

struct ContentView: View {
var body: some View {
List {
ForEach(Models) { Model in
HStack {

Text(Model.title)
.font(.system(size: 17))

Spacer()

Text(Model.placehoder)
.font(.system(size: 14))
.foregroundColor(Color.gray)
}
}
}
}
}

Swift实用小册20: Protocol协议的使用_iOS_03

协议的创建

上面,我们演示了​​Identifiable​​​协议的作用,在​​Swift​​​开发过程中,我们使用最多的也是官方提供的协议,像​​Identifiable​​​协议,​​Codable​​​协议,​​Hashable​​协议。

如果我们需要创建协议,需要使用到​​protocol​​​关键字,创建协议的方式和​​class​​​类、​​struct​​结构体创建方式类似。示例:

protocol Person {
func addPerson()
}

上述代码中,我们创建了一个​​Person​​​协议,在​​Person​​协议内我们定义了一个方法。

使用​​Person​​协议的方式和子类继承父类的方式相同,但是:

继承只能继承一个父类,而类或者结构体可以遵循多个协议。

示例:

struct FullName: Person {
func addPerson() {
print("实现协议方法")
}
}

我们创建了一个​​FullName​​​结构体,遵循​​Person​​​协议,然后在​​FullName​​​结构体中使用​​addPerson​​方法。

协议的属性

协议用于指定特定的实例属性或类属性,而不用指定是存储型属性或计算型属性,此外还必须指明是只读的还是可读可写的。

协议的属性有两种:可读可写属性,只读属性

可读可写属性:{ set get }

只读属性:{ get }

使用协议的属性的方法和声明计算属性或存储属性类似,只是后面需要加上关键字。示例:

protocol Person2 {
var present: Bool { get }
var message: String { get set }
}

struct FullName2: Person2 {
var present: Bool = true
var message: String = "名称信息"

上述代码中,我们创建了一个​​Person2​​​协议,它有​​2​​​个变量属性:​​present​​​、​​message​​​,其中​​present​​​是只读属性,​​message​​是可读可写属性。

然后,我们创建了一个结构体​​FullName2​​​,遵循​​Person2​​​协议。我们就可以直接使用使用​​Person2​​协议声明的属性。

Swift实用小册20: Protocol协议的使用_控制流_04

本章代码

import SwiftUI

struct Model: Identifiable {
var id = UUID()
var title: String
var placehoder: String
}

var Models = [ Model(title: "基础部分", placehoder: "常量和变量的使用"), Model(title: "基础运算符", placehoder: "基础运算符的使用"), Model(title: "字符串和字符", placehoder: "字符串的使用"), Model(title: "集合类型", placehoder: "集合类型的使用"), Model(title: "控制流", placehoder: "控制流的使用")]

struct ContentView: View {
var body: some View {
List {
ForEach(Models) { Model in
HStack {
Text(Model.title)
.font(.system(size: 17))

Spacer()

Text(Model.placehoder)
.font(.system(size: 14))
.foregroundColor(Color.gray)
}
}
}
}
}

struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}

protocol Person {
func addPerson()
}

struct FullName: Person {
func addPerson() {
print("实现协议方法")
}
}

protocol Person2 {
var present: Bool { get }
var message: String { get set }
}

struct FullName2: Person2 {
var present: Bool = true
var message: String = "名称信息"

以上就是本章的全部内容。

快来动手试试吧!

如果本专栏对你有帮助,不妨点赞、评论、关注~

举报

相关推荐

0 条评论