【发布时间】:2018-06-01 08:52:11
【问题描述】:
我正在设计我们的 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 创建结构的默认初始化程序,这样我就不必手动编写所有这些了。
注意:
- 我在这里选择结构是因为 Swift 为它们提供了默认的初始化器,而类 AFAIK 没有。
- 显然,必需的参数必须放在第一位。除此之外,没关系(尽管它们也必须按定义顺序排列也没关系。重点是我不在乎。)
- 成员变量可以是
let或var。我只是习惯使用let。
那么...可以简化/减少/消除这段代码吗?
【问题讨论】:
-
已编辑。随意对这样的事情做同样的事情。我就是这么做的。
标签: swift struct initialization