gpt4 book ai didi

swift - 你能利用 Swift 的结构默认初始化器来简化参数传递吗?

转载 作者:搜寻专家 更新时间:2023-10-31 08:07:40 26 4
gpt4 key购买 nike

我正在设计我们的 API 以将具体的查询对象作为单个参数,而不是展开所有可以传递参数的地方的签名。

例如,与其写这个……

func someQuery(requiredA:Bool, requiredB:Int, requiredC:String, defaultedA:Bool = false, defaultedB:Int = 1, defaultedC:String = "X", optionalA:Bool? = nil, optionalB:Int? = nil, optionalC:String? = nil){
....
}

我正在写这个...

func someQuery(queryParams:QueryParams){
....
}

我正在定义(部分——更多内容见下文)这样的查询对象……;

struct QueryObject{
let requiredA : Bool
let requiredB : Int
let requiredC : String
let defaultedA : Bool
let defaultedB : Int
let defaultedC : String
let optionalA : Bool?
let optionalB : Int?
let optionalC : String?
}

我相信您可以从名称中看出,对于这个例子,有些是必需的,有些是默认的,有些是完全可选的。

现在关于定义 QueryParams 对象,我正在努力做到这一点,以便在他们创建它时,用户只需指定所需的参数,并且可以根据需要/认为合适来选择指定其他参数。

这就是我想要的...

// At a minimum
let queryParams = QueryParams(requiredA:true, requiredB:1, requiredC:"x")

// Minimums overriding a default
let queryParams = QueryParams(requiredA:true, requiredB:1, requiredC:"x", defaultC:"y")

// Minimums plus an optional, still picking up all defaults
let queryParams = QueryParams(requiredA:true, requiredB:1, requiredC:"x", optionalB:8)

为了实现这一点,我创建了自己的初始化器,它除了在内部分配参数外什么都不做,就像这样......

struct QueryParams{

init(
requiredA : Bool,
requiredB : Int,
requiredC : String,
defaultedA : Bool = true,
defaultedB : Int = 1,
defaultedC : String = "x",
optionalA : Bool? = nil,
optionalB : Int? = nil,
optionalC : String? = nil
){
self.requiredA = requiredA
self.requiredB = requiredB
self.requiredC = requiredC
self.defaultedA = defaultedA
self.defaultedB = defaultedB
self.defaultedC = defaultedC
self.optionalA = optionalA
self.optionalB = optionalB
self.optionalC = optionalC
}

let requiredA : Bool
let requiredB : Int
let requiredC : String
let defaultedA : Bool
let defaultedB : Int
let defaultedC : String
let optionalA : Bool?
let optionalB : Int?
let optionalC : String?
}

...这看起来像是很多样板代码。我试图找出是否有任何方法可以利用 Swift 创建结构的默认初始化程序,这样我就不必手动写出所有这些内容。

注意事项:

  1. 我在这里选择结构体是因为 Swift 为它们提供了默认的初始化器,而类 AFAIK 没有得到它。
  2. 显然,必需的参数必须排在第一位。除此之外,没关系(尽管如果它们也必须按定义顺序也很好。重点是我不在乎。)
  3. 成员变量可以是letvar。我只是习惯使用 let

那么...可以简化/减少/消除这段代码吗?

最佳答案

您无法从默认初始化程序中单独获得这种控制。就最少的代码而言,我会推荐这样的东西。

struct QueryParams{

let requiredA : Bool
let requiredB : Int
let requiredC : String
var defaultedA : Bool = true
var defaultedB : Int = 1
var defaultedC : String = "x"
var optionalA : Bool? = nil
var optionalB : Int? = nil
var optionalC : String? = nil
}

extension QueryParams {
init(
requiredA : Bool,
requiredB : Int,
requiredC : String
){
self.requiredA = requiredA
self.requiredB = requiredB
self.requiredC = requiredC
}
}

通过将自定义初始化器放在扩展中,您可以免费保留默认初始化器。唯一的问题是,如果他们只想自定义一些非必需的属性,他们需要在初始化后执行这些操作。

关于swift - 你能利用 Swift 的结构默认初始化器来简化参数传递吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47878181/

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