前言
和Apple
官网或者网上分享的教程类文章不同,我将以实际开发角度讲述Swift
语言的一些概念和用法,方便大家更好地学习和掌握Swift
语言。
这同时也是对自己学习Swift
语言过程的知识整理。
如有错误,以你为准。
项目创建
我们新建一个SwiftUI
项目,命名为SwiftUIProtocol
。
协议的定义
协议,规定了用来实现某一特定功能所必需的方法和属性。
协议提供具体实现来完成协议定义的方法和功能,可以用在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: "控制流的使用") ]
上述代码中,我们创建了一个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) } } } } }
协议的创建
上面,我们演示了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
协议声明的属性。
本章代码
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 = "名称信息" }
以上就是本章的全部内容。
快来动手试试吧!
如果本专栏对你有帮助,不妨点赞、评论、关注~