在JavaScript/TypeScript中,这种模式经常用于库中,其中有一个可选参数作为最后一个函数参数,默认为某些默认配置。
看起来是这样的:
const smth = someLibrary("requiredParameter", {
someOptionalProperty: true,
// ...other options available, but not required to be provided here.
});在图书馆方面,它应该是这样的:
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年的经验告诉我的,如果您想做类似的事情,您必须使用所有配置参数创建一个结构,然后在实例化该结构之后改变默认设置。以下内容如下所示:
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.
来说变得非常庞大。
问题
现在的问题是-我能用Swift离JavaScript版本有多近?
也许我错过了一个模式或者函数可以帮我做到这一点?
我的目标是不要有巨大的样板,使我的图书馆可定制。
发布于 2022-04-24 11:05:47
这里有一个示例:
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:为类型准确性添加浮动
https://stackoverflow.com/questions/71986839
复制相似问题