持续创作,加速成长!这是我参加「日新计划 · 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)
    }
}

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

快来动手试试吧!

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