Swift实用小册13:Initializer构造函数的使用

简介: 构造函数是一种特殊的函数,主要用来在创建对象时初始化对象,为对象成员变量设置初始值。在之前的章节中,我们在类、结构体中可以声明常量和变量,并给变量/常量赋予了初始值,但如果不同业务当中存在初始值不同的情况,按照之前的方式,我们需要在具体业务中重新赋值。

image.png

在本章中,你将学会Initializer构造函数的使用方法。

前言

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

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

如有错误,以你为准。

构造函数的定义


构造函数是一种特殊的函数,主要用来在创建对象时初始化对象,为对象成员变量设置初始值。

在之前的章节中,我们在类、结构体中可以声明常量和变量,并给变量/常量赋予了初始值,但如果不同业务当中存在初始值不同的情况,按照之前的方式,我们需要在具体业务中重新赋值。

这,不够优雅。

Swift语法中,我们可以使用构造函数的init()方法,使用声明好类型的构造参数,然后在具体业务当中调用我们类、结构体的声明好的参数,这样就可以不需要重新给参数赋予初始值。

构造函数的使用


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

image.png

Swift开发中,我们之前学过List的用法,我们需要一个List展示一行行的数据。示例:

struct ContentView: View {
    var body: some View {
        // 简单的列表
        List {
            ForEach(1 ... 4, id: \.self) { index in
                Text("第 \(index)页")
            }
        }
    }
}

image.png

上述代码中,我们构建了一个List列表,然后遍历4条数据,然后以Text文本的方式展示出来。

此时我们可能存在一个业务需求,需要使用列表,但不希望使用List自带的背景色。由于SwiftUI中的List列表本身去掉背景颜色的API,这时我们需要自己实现它。这里我们就可以使用构造函数的init()方法,在这个实例被调用时去掉背景色。

// 去掉List背景颜色
init() {
    UITableView.appearance().backgroundColor = .clear
}

image.png

上述代码中,我们使用了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))

image.png

本章完整代码


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)
    }
}

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

快来动手试试吧!

相关文章
|
数据安全/隐私保护 Swift
Swift实用小册26: 正则表达式的使用
在本章中,你将学会常用的正则表达式的使用方法。
297 3
Swift实用小册26: 正则表达式的使用
|
存储 Swift
Swift实用小册25: 高级运算符之位运算符的使用
在本章中,你将学会高级运算符的位运算符的使用方法。
244 0
Swift实用小册25: 高级运算符之位运算符的使用
|
数据安全/隐私保护 Swift 索引
Swift实用小册24: AccessControl访问控制的使用
在本章中,你将学会AccessControl访问控制的使用方法。
195 0
Swift实用小册24: AccessControl访问控制的使用
|
Swift
Swift实用小册23: ARC自动引用计数机制的使用
在本章中,你将学会ARC自动引用计数机制的使用方法。
187 0
Swift实用小册23: ARC自动引用计数机制的使用
|
Swift
Swift实用小册22: OpaqueTypes不透明类型的使用
在本章中,你将学会OpaqueTypes不透明类型的使用方法。
286 0
Swift实用小册22: OpaqueTypes不透明类型的使用
|
Swift
Swift实用小册21: Generics泛型的使用
在本章中,你将学会Generics泛型的使用方法。
174 0
Swift实用小册21: Generics泛型的使用
|
存储 前端开发 Swift
Swift实用小册20: Protocol协议的使用
在本章中,你将学会Protocol协议的使用方法。
266 0
Swift实用小册20: Protocol协议的使用
|
存储 前端开发 Swift
Swift实用小册19:Extension扩展的使用
在本章中,你将学会Extension扩展的使用方法。
396 0
Swift实用小册19:Extension扩展的使用
|
Swift
Swift实用小册18:NestedTypes嵌套类型的使用
在本章中,你将学会NestedTypes嵌套类型的使用方法。
218 0
Swift实用小册18:NestedTypes嵌套类型的使用
|
存储 Swift
Swift实用小册17:类型检查和类型转换
在本章中,你将学会类型检查和类型转换的使用方法。
166 0
Swift实用小册17:类型检查和类型转换