首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >作为Swift参数的大配置对象?

作为Swift参数的大配置对象?
EN

Stack Overflow用户
提问于 2022-04-24 08:50:12
回答 1查看 141关注 0票数 0

在JavaScript/TypeScript中,这种模式经常用于库中,其中有一个可选参数作为最后一个函数参数,默认为某些默认配置。

看起来是这样的:

代码语言:javascript
复制
const smth = someLibrary("requiredParameter", {
  someOptionalProperty: true,
  // ...other options available, but not required to be provided here.
});

在图书馆方面,它应该是这样的:

代码语言:javascript
复制
export const someLibrary = (requiredParameter: string, options?: Options) => {
  const opts = { ...defaultOptions, ...options };

  // Here `opts` will have the default properties merged with the ones that you provided.
}

现在,在Swift中,根据我2-3年的经验告诉我的,如果您想做类似的事情,您必须使用所有配置参数创建一个结构,然后在实例化该结构之后改变默认设置。以下内容如下所示:

代码语言:javascript
复制
struct Options {
  var option1: Double = 2.0
  var option2: Int = 1
  // ...etc
}

public func someLibrary(_ requiredParameter: String, options: Options?) {
  // ...
}

let opts = Options()
opts.someParameter = "Overriding the values here"

let result = someLibrary("requiredParameter", options: )

问题

Swift实现有几个问题,JavaScript做得很好:

默认选项覆盖,但是只是更改的字段--我还无法用至少在选项的elegance.

  • Partial覆盖中非常接近的解决方案来快速地复制它--我在swift中使用的方法是使用带有所有可选参数的结构初始化器,但是初始化器对于大configurations.

来说变得非常庞大。

问题

现在的问题是-我能用Swift离JavaScript版本有多近?

也许我错过了一个模式或者函数可以帮我做到这一点?

我的目标是不要有巨大的样板,使我的图书馆可定制。

EN

回答 1

Stack Overflow用户

发布于 2022-04-24 11:05:47

这里有一个示例:

代码语言:javascript
复制
struct Options {
    // option values are saved in private dictionary of Any
    private var options = [String:Any]()
    
    init(withOptions options: [String:Any]) {
        self.options = options
    }
    
    // Get int option
    subscript(intOption: String) -> Int {
        return options[intOption] as? Int ?? 0
    }

    // Get string option
    subscript(stringOption: String) -> String {
        return options[stringOption] as? String ?? ""
    }

    // Get float option
    subscript(floatOption: String) -> Float {
        return options[floatOption] as? Float ?? 0.0
    }
    
    // generic option but return an optional
    subscript<T>(withName: String) -> T? {
        return options[withName] as? T
    }
}

let options: Options = Options(withOptions: ["option1": 1,
                                             "option2": "string 2",
                                             "option3": Float(3.0), // set type if you want correct value
                                             "option4": 4.0])

let o1: Int = options["option1"]
let o2: String = options["option2"]
let o3: Float = options["option3"]
let o4: Double? = options["option4"]

这是一个基础,可以帮助你,这里的下标是一个很好的方法去获得值。

编辑:添加非类型化访问编辑2:为类型准确性添加浮动

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71986839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档