在本章中,你将学会Initializer
构造函数的使用方法。
前言
和Apple
官网或者网上分享的教程类文章不同,我将以实际开发角度讲述Swift
语言的一些概念和用法,方便大家更好地学习和掌握Swift
语言。
这同时也是对自己学习Swift
语言过程的知识整理。
如有错误,以你为准。
构造函数的定义
构造函数是一种特殊的函数,主要用来在创建对象时初始化对象,为对象成员变量设置初始值。
在之前的章节中,我们在类、结构体中可以声明常量和变量,并给变量/常量赋予了初始值,但如果不同业务当中存在初始值不同的情况,按照之前的方式,我们需要在具体业务中重新赋值。
这,不够优雅。
在Swift
语法中,我们可以使用构造函数的init()
方法,使用声明好类型的构造参数,然后在具体业务当中调用我们类、结构体的声明好的参数,这样就可以不需要重新给参数赋予初始值。
构造函数的使用
我们新建一个SwiftUI
项目,命名为SwiftUIInitializer
。
在Swift
开发中,我们之前学过List
的用法,我们需要一个List
展示一行行的数据。示例:
struct ContentView: View { var body: some View { // 简单的列表 List { ForEach(1 ... 4, id: \.self) { index in Text("第 \(index)页") } } } }
上述代码中,我们构建了一个List
列表,然后遍历4
条数据,然后以Text
文本的方式展示出来。
此时我们可能存在一个业务需求,需要使用列表,但不希望使用List
自带的背景色。由于SwiftUI
中的List
列表本身去掉背景颜色的API
,这时我们需要自己实现它。这里我们就可以使用构造函数的init()
方法,在这个实例被调用时去掉背景色。
// 去掉List背景颜色 init() { UITableView.appearance().backgroundColor = .clear }
上述代码中,我们使用了init
关键字命名的构造器的方法,在创建ContentView
实例时被调用,因为List
的底层是UITableView
,因此我们使它的背景颜色为clear
,也就是没有背景颜色。
这是简单的构造函数的用法。
构造参数的使用
我们也可以在定义构造器init()
时提供构造参数,然后在实例中就可以直接使用这些参数。
在Swift
开发过程中,我们常常使用到RGB
颜色,我们在Color
设置里都需要除以255
才能使用RGB
颜色。
let mainBtnColor = Color(red: 132.0 / 255.0, green: 161.0 / 255.0, blue: 255.0 / 255.0)
这,不够优雅。
为了更方便地使用RGB
颜色,我们可以对Color
进行扩展。示例:
extension Color { init(_ r: CGFloat, _ g: CGFloat, _ b: CGFloat) { let red = r / 255.0 let green = g / 255.0 let blue = b / 255.0 self.init(red: red, green: green, blue: blue) } }
上述代码中,我们对Color
进行拓展,在Color
构造体中,我们为红、蓝、绿提供三个CGFloat
类型的形参进行命名,然后初始化Color
构造体本身。
这样,我们要使用Color
颜色时,就只需要填入RGB
值,而不用再输入参数
和除以255
了,大大提高了编程的便捷性。
我们可以直接在需要使用到Color
的地方调用。
.foregroundColor(Color(55, 186, 8))
本章完整代码
import SwiftUI struct ContentView: View { // 去掉List背景颜色 init() { UITableView.appearance().backgroundColor = .clear } var body: some View { // 简单的列表 List { ForEach(1 ... 4, id: \.self) { index in Text("第 \(index)页") .foregroundColor(Color(55, 186, 8)) } } } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } } extension Color { init(_ r: CGFloat, _ g: CGFloat, _ b: CGFloat) { let red = r / 255.0 let green = g / 255.0 let blue = b / 255.0 self.init(red: red, green: green, blue: blue) } }
以上就是本章的全部内容。
快来动手试试吧!