您是否可以利用Swift的结构默认初始化器来简化参数传递?

您是否可以利用Swift的结构默认初始化器来简化参数传递?,第1张

概述我正在设计我们的API,将具体的查询对象作为单个参数,而不是爆炸出可以传递参数的所有位置的签名. 例如,而不是写这个…… func someQuery(requiredA:Bool, requiredB:Int, requiredC:String, defaultedA:Bool = false, defaultedB:Int = 1, defaultedC:String = "X", optio 我正在设计我们的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 minimumlet queryParams = queryParams(requiredA:true,requiredB:1,requiredC:"x")// Minimums overrIDing a defaultlet queryParams = queryParams(requiredA:true,requiredC:"x",defaultC:"y")// Minimums plus an optional,still picking up all defaultslet queryParams = queryParams(requiredA:true,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作为习惯.

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

解决方法 你无法从它自己的默认初始化程序中获得那种控制.就最少量的代码而言,我会推荐这样的东西.

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,requiredC  : String        ){        self.requiredA  = requiredA        self.requiredB  = requiredB        self.requiredC  = requiredC    }}

通过将自定义初始值设定项放在扩展名中,可以免费保留默认初始化程序.唯一的问题是,如果他们只想定制一些非必需的属性,他们将在初始化后需要这些属性.

总结

以上是内存溢出为你收集整理的您是否可以利用Swift的结构默认初始化器来简化参数传递?全部内容,希望文章能够帮你解决您是否可以利用Swift的结构默认初始化器来简化参数传递?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1015461.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存