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

举报
文如秋雨 发表于 2022/08/30 12:58:08 2022/08/30
【摘要】 在本章中,你将学会Initializer构造函数的使用方法。前言和Apple官网或者网上分享的教程类文章不同,我将以实际开发角度讲述Swift语言的一些概念和用法,方便大家更好地学习和掌握Swift语言。这同时也是对自己学习Swift语言过程的知识整理。如有错误,以你为准。构造函数的定义构造函数是一种特殊的函数,主要用来在创建对象时初始化对象,为对象成员变量设置初始值。在之前的章节中,我们在...
在本章中,你将学会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进行拓展,在构造体中,我们为红蓝绿提供三个合适 CGFloat 类型的形参命名,然后初始化本身。

这样我们要使用Color颜色时,就只需要填入RGB值,大大提高了编程的便捷性。

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


以上就是本章的全部内容。
快来动手试试吧!
如果本专栏对你有帮助,不妨点赞、评论、关注~
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。