今日主要说说SwiftUI页面的Init,以及Enum的用法,这个很简略,可是也需要说一下。当你在初始化做一些改动时,你就会用上。枚举就不用说太多了,由于简直和其他的言语用法很类似。比方你要描述上下左右,假如新手就会运用硬编码运用字符来判别,可是假如引进enum后,咱们的代码可读性就会大幅度进步,结构也会变得更和谐。好了咱们来一起看看吧
Init
咱们的比方是一个简略的页面,总共有三个参数,生果的数量,生果的色彩,生果的称号,详细如下
当咱们去掉特点的默认值,那么就必须要从初始化View时传入参数。可是咱们却看不到Init办法。
咱们在Preview的办法里面传入了对应的参数,假如不传入就会报错。
那么其实每个View都有一个隐藏的办法,比方我上面声明的三个特点,那么View会主动生成一个init办法
struct InitAndEnumsSample: View {
let background: Color
let count: Int
let fruit: String
init(background: Color, count: Int, fruit: String) {
self.background = background
self.count = count
self.fruit = fruit
}
var body: some View {
VStack(spacing: 10) {
Text("(count)")
.font(.largeTitle)
.foregroundColor(Color.white)
.underline()
Text("(fruit)")
.font(.headline)
.foregroundColor(Color.white)
}
.frame(width: 150, height: 150)
.background(background)
.cornerRadius(8)
}
}
你能够用两种办法来证明。
办法一
运用编译过程中的相关命令,下面的办法是把文件生产汇编
swiftc -emit-silgen InitAndEnumsSample.swift -o xxx.sil
生成后打开文件,你能够看到一下内容(并不是悉数的汇编文件)
以上文件的倒数第二行,能够看到其实编译后的文件会默认添加一个init办法,参数和咱们上面声明的特点对应
这是另一处,详细初始化的当地。详细的汇编代码,后面有时间我也会出一篇教程。现在只需要知道init是View文件隐藏的办法即可。
办法二
咱们能够从新界说一个新的init办法。
咱们定一个新的init办法,只有两个参数。此刻假如咱们不改动Preview传入的参数,那么就会报错,原因是之前的默认init办法已经被咱们改动了,所以原来的办法找不到了,所以会报错。当咱们运用新界说的init办法就不会有问题了
这样能够证明,它有一个默认的init办法,当咱们从头界说init办法时,就需要运用新的init办法来初始化
咱们现在有一个新的需求,输入一个生果称号,就能够给出对应的生果色彩和生果称号
假如是刚入门的新手一般会运用字符匹配来完结这个任务,例如下面的代码
init(count: Int, fruit: String) {
self.count = count
self.fruit = fruit
if fruit == "Apple" {
self.background = Color.red
} else if fruit == "Grape"{
self.background = Color.green
} else {
self.background = Color.blue
}
}
会依据生果的称号来给出对应的色彩值填充。这样也能够达到目的,可是对于保护来说很不容意,假如这样的代码用在了多处,假如有一个产品的需求需要改某一个判别条件的值,那么所以这种硬编码的当地都需要改,并且简单出错,一切咱们会运用枚举来完结这个作业。
Enum
Swift编程言语中的Enum(枚举)时,它是一种用于界说一组相关值的数据类型。Enum在Swift中被广泛应用,用于创立具有离散值的类型,以进步代码的可读性和可保护性。
Enum答应您界说一组或许的值,每个值都被称为一个”case”(状况)。每个case能够相关一个特定的值或者是没有相关值的状况。
以下是一个简略的比方,展示了如何创立和运用Enum:
enum CompassDirection {
case north
case south
case east
case west
}
let direction = CompassDirection.north
switch direction {
case .north:
print("Heading north")
case .south:
print("Heading south")
case .east:
print("Heading east")
case .west:
print("Heading west")
}
在上述示例中,咱们界说了一个名为CompassDirection
的Enum,表明罗盘的方向。该Enum有四个case:north
、south
、east
和west
。咱们能够运用这些case来表明不同的罗盘方向。
在switch语句中,咱们依据direction
的值来执行不同的操作。这种办法使代码更易读和保护,由于咱们能够直观地了解每个case代表的详细含义
有了以上比方,根本你应该知道枚举是干啥的了。那么咱们改造一下咱们之前的比方,把枚举应用其间。
init(fruit: Fruit, count: Int) {
self.count = count
if fruit == .Apple {
self.background = Color.red
self.fruitName = "Apple"
} else {
self.background = Color.green
self.fruitName = "Grape"
}
}
enum Fruit {
case Apple
case Grape
}
首要咱们界说枚举值,apple和grape。初始化办法也经过了略微改造,变成了传入一个枚举值和一个数量参数,判别部分仍是没变,只不过判别的类型由之前的String,变成了现在的枚举。在prview这儿也由之前的string变成了枚举
struct InitAndEnumsSample_Previews: PreviewProvider {
static var previews: some View {
InitAndEnumsSample(
fruit: .Apple,
count: 10
)
}
}
来看看终究的作用,咱们在priview里面创立了两个实例。一个传入apple,一个传入Grape。
终究的代码
import SwiftUI
struct InitAndEnumsSample: View {
let background: Color
let count: Int
let fruitName: String
init(fruit: Fruit, count: Int) {
self.count = count
if fruit == .Apple {
self.background = Color.red
self.fruitName = "Apple"
} else {
self.background = Color.purple
self.fruitName = "Grape"
}
}
enum Fruit {
case Apple
case Grape
}
var body: some View {
VStack(spacing: 10) {
Text("(count)")
.font(.largeTitle)
.foregroundColor(Color.white)
.underline()
Text("(fruitName)")
.font(.headline)
.foregroundColor(Color.white)
}
.frame(width: 150, height: 150)
.background(background)
.cornerRadius(8)
}
}
struct InitAndEnumsSample_Previews: PreviewProvider {
static var previews: some View {
HStack {
InitAndEnumsSample(
fruit: .Apple,
count: 10
)
InitAndEnumsSample(
fruit: .Grape,
count: 8
)
}
}
}
这一节并不难,当你有需求在初始化是对某些数据要做处理时,不妨多向这个方向想想。
谢谢观看,喜欢就点击加个小爱心吧