Mar*_*eIV 5 struct initialization swift
我正在设计我们的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){
....
}
Run Code Online (Sandbox Code Playgroud)
我写这个......
func someQuery(queryParams:QueryParams){
....
}
Run Code Online (Sandbox Code Playgroud)
我正在定义(部分 - 更下面)查询对象,就像这样......;
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?
}
Run Code Online (Sandbox Code Playgroud)
我确信您可以从名称中分辨出来,对于此示例,有些是必需的,有些是默认值,有些是完全可选的.
现在,为了定义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)
Run Code Online (Sandbox Code Playgroud)
为了实现这一点,我创建了自己的初始化程序,除了内部分配参数外什么都不做,就像这样......
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?
}
Run Code Online (Sandbox Code Playgroud)
...这似乎是很多样板代码.我试图找出是否有任何方法可以利用Swift创建结构的默认初始化程序,因此我不必手动编写所有这些.
值得注意的是
let
或var
.我只是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
}
}
Run Code Online (Sandbox Code Playgroud)
通过将自定义初始值设定项放入扩展中,您可以免费保留默认初始值设定项。唯一的问题是,如果他们只想自定义一些非必需的属性,则需要在初始化后执行这些操作。
归档时间: |
|
查看次数: |
160 次 |
最近记录: |