今日主要说说SwiftUI页面的Init,以及Enum的用法,这个很简略,可是也需要说一下。当你在初始化做一些改动时,你就会用上。枚举就不用说太多了,由于简直和其他的言语用法很类似。比方你要描述上下左右,假如新手就会运用硬编码运用字符来判别,可是假如引进enum后,咱们的代码可读性就会大幅度进步,结构也会变得更和谐。好了咱们来一起看看吧


Init

咱们的比方是一个简略的页面,总共有三个参数,生果的数量,生果的色彩,生果的称号,详细如下

Inits,Enums inSwiftUI

当咱们去掉特点的默认值,那么就必须要从初始化View时传入参数。可是咱们却看不到Init办法。

咱们在Preview的办法里面传入了对应的参数,假如不传入就会报错。

Inits,Enums inSwiftUI

那么其实每个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

生成后打开文件,你能够看到一下内容(并不是悉数的汇编文件)

Inits,Enums inSwiftUI

以上文件的倒数第二行,能够看到其实编译后的文件会默认添加一个init办法,参数和咱们上面声明的特点对应

Inits,Enums inSwiftUI

这是另一处,详细初始化的当地。详细的汇编代码,后面有时间我也会出一篇教程。现在只需要知道init是View文件隐藏的办法即可。

办法二

咱们能够从新界说一个新的init办法。

Inits,Enums inSwiftUI

咱们定一个新的init办法,只有两个参数。此刻假如咱们不改动Preview传入的参数,那么就会报错,原因是之前的默认init办法已经被咱们改动了,所以原来的办法找不到了,所以会报错。当咱们运用新界说的init办法就不会有问题了

Inits,Enums inSwiftUI

这样能够证明,它有一个默认的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:northsoutheastwest。咱们能够运用这些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。

Inits,Enums inSwiftUI

终究的代码

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

这一节并不难,当你有需求在初始化是对某些数据要做处理时,不妨多向这个方向想想。

谢谢观看,喜欢就点击加个小爱心吧