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

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第16天,点击查看活动详情

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

前言

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

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

如有错误,以你为准。

构造函数的定义

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

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

这,不够优雅。

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

构造函数的使用

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

1.png

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

struct ContentView: View {
    var body: some View {

        // 简单的列表
        List {
            ForEach(1 ... 4, id: \.self) { index in
                Text("第 \(index)页")
            }
        }
    }
}
复制代码

2.png

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

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

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

3.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))
复制代码

4.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)
    }
}
复制代码

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

快来动手试试吧!

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

猜你喜欢

转载自juejin.im/post/7107252488889171976