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

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

image.png

前言


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

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

如有错误,以你为准。

项目创建


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

image.png

协议的定义


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

协议提供具体实现来完成协议定义的方法和功能,可以用在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: "控制流的使用")
]

image.png

上述代码中,我们创建了一个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)
                }
            }
        }
    }
}

image.png

协议的创建


上面,我们演示了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个变量属性:presentmessage,其中present是只读属性,message是可读可写属性。

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

image.png

本章代码


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 = "名称信息"
}

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

快来动手试试吧!

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

相关文章
|
6月前
|
Swift iOS开发
Swift 语言: 什么是协议(Protocol)?如何实现和使用协议?
Swift 语言: 什么是协议(Protocol)?如何实现和使用协议?
190 2
|
算法 Swift C++
34 Swift为了协议 关联类型
Swift为了协议 关联类型
72 0
|
存储 Swift iOS开发
31 Swift 继续聊聊协议扩展
Swift 继续聊聊协议扩展
107 0
|
9天前
|
存储 Swift 开发者
Swift 协议
Swift 协议
19 0
|
6月前
|
设计模式 Swift iOS开发
【Swift开发专栏】Swift中的协议与委托模式
【4月更文挑战第30天】Swift编程语言强调协议与委托模式。协议定义了类型需实现的方法和属性,如`SomeProtocol`示例。遵循协议的类、结构体或枚举需实现协议要求。协议可继承,也可作为类型使用。委托模式让对象间通信更灵活,通过协议实现,如`DataSourceDelegate`示例。实战案例展示了在`UITableView`和自定义下载器中使用委托模式。
120 0
|
4月前
|
存储 安全 Swift
Swift高级特性:泛型与协议
【7月更文挑战第10天】Swift高级特性:泛型与协议增强代码复用与类型安全。泛型允许编写通用代码,如`swap`函数和泛型`Stack`结构体,支持类型约束如`Comparable`。协议定义行为蓝图,类型遵循协议需实现其要求。通过两者结合,构建高效灵活的代码结构。
|
Swift C++ Ruby
32 Swift面向协议编程初探
32 Swift面向协议编程初探
71 0
|
数据安全/隐私保护 Swift
Swift实用小册26: 正则表达式的使用
在本章中,你将学会常用的正则表达式的使用方法。
297 3
Swift实用小册26: 正则表达式的使用
|
存储 Swift
Swift实用小册25: 高级运算符之位运算符的使用
在本章中,你将学会高级运算符的位运算符的使用方法。
246 0
Swift实用小册25: 高级运算符之位运算符的使用
|
数据安全/隐私保护 Swift 索引
Swift实用小册24: AccessControl访问控制的使用
在本章中,你将学会AccessControl访问控制的使用方法。
195 0
Swift实用小册24: AccessControl访问控制的使用