Swift实用小册13:Initializer构造函数的使用
【摘要】 在本章中,你将学会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)