gpt4 book ai didi

swift - 使用 init 函数初始化对象,为其参数提供默认值

转载 作者:可可西里 更新时间:2023-11-01 00:55:08 24 4
gpt4 key购买 nike

我有以下类(class):

final class A {

let propertyA: Int
let propertyB: String
let propertyC: Double

init(propertyA: Int = 100, propertyB: String = "propertyB", propertyC: Double = 10.0) {
self.propertyA = propertyA
self.propertyB = propertyB
self.propertyC = propertyC
}
}

如您所见,它的所有属性都定义为 let 并且 init 为它们提供了一些默认值。为了创建此类的实例,我使用了一些非常量数据:

var a: Int? = nil // Some random values that can be nil
var b: String? = "b"
var c: Double? = 100.0

这是一个非常大的代码片段,它创建了一个 A 的实例:

let objectA: A
if let a = a, let b = b, let c = c {
objectA = A(propertyA: a, propertyB: b, propertyC: c)
} else if let a = a, let b = b {
objectA = A(propertyA: a, propertyB: b)
} else if let b = b, let c = c {
objectA = A(propertyB: b, propertyC: c)
} else if let a = a, let c = c {
objectA = A(propertyA: a, propertyC: c)
} else if let a = a {
objectA = A(propertyA: a)
} else if let b = b {
objectA = A(propertyB: b)
} else if let c = c {
objectA = A(propertyC: c)
} else {
objectA = A()
}

objectA 的初始化太大了,我想找个办法让它变小。但是我不想将 A 的属性声明为 var

最佳答案

最好完成对 a、b、c 的所有 nil/非 nil 组合的测试使用 switch 语句:

switch (a, b, c) {
case (let a?, let b?, let c?):
objectA = A(propertyA: a, propertyB: b, propertyC: c)
case (nil, let b?, let c?):
objectA = A(propertyB: b, propertyC: c)
case (let a?, nil, let c?):
objectA = A(propertyA: a, propertyC: c)
case (let a?, let b?, nil):
objectA = A(propertyA: a, propertyB: b)
case (let a?, nil, nil):
objectA = A(propertyA: a)
case (nil, let b?, nil):
objectA = A(propertyB: b)
case (nil, nil, let c?):
objectA = A(propertyC: c)
case(nil, nil, nil):
objectA = A()
}

主要优点是编译器检查开关是否详尽无遗,即所有可能的组合都只处理一次。

但是,这并没有解决您的主要问题:组合的数量随着参数的数量呈指数增长。

如果您将所有参数定义为 optionals,默认值为 nil,并在 init 函数的主体中替换实际的默认值(例如,使用可选链接) :

final class A {

let propertyA: Int
let propertyB: String
let propertyC: Double

init(propertyA: Int? = nil, propertyB: String? = nil, propertyC: Double? = nil) {
self.propertyA = propertyA ?? 100
self.propertyB = propertyB ?? "propertyB"
self.propertyC = propertyC ?? 10.0
}
}

然后你可以省略一个参数,或者传递 nil,效果相同。

因此,创建 A 实例的代码片段减少为对初始化程序的单个调用,与参数:

var a: Int? = nil // Some random values that can be nil
var b: String? = "b"
var c: Double? = 100.0

let objectA = A(propertyA: a, propertyB: b, propertyC: c)

关于swift - 使用 init 函数初始化对象,为其参数提供默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51447350/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com