在swift中,函数可以具有可选参数,这些参数具有默认值,例如:
func f(a:Int, b:Int?=nil) {} f(1); f(1,2);
我想用枚举的相关值来做这个.在这篇关于类型安全url路由的帖子之后,我想有一个可以采用可选参数的路由,例如:
enum StopPoint { case Search(query:String, limit:Int?=nil) }
但是它说我不能为元组中的参数设置默认值.然而,可能存在诸如case Arrivals(stopId:Int)
但是通常不可能具有具有一个命名参数的元组的情况.
那么是否可以使用带有默认参数的枚举,并且关联值是否为元组?
你能做的是:
enum StopPoint { case Search(query: String, limit: Int?) init(query: String, limit: Int? = nil) { self = .Search(query: query, limit: limit) } } let foo = StopPoint(query: "default") // Search("default", nil) let bar = StopPoint(query: "special", limit: 42) // Search("special", Optional(42))
您可以通过在枚举上创建与您希望允许使用可选参数的枚举大小写匹配的静态函数来实现。
enum StopPoint { case search(query: String, limit: Int?) static func search(query: String) -> StopPoint { return .search(query: query, limit: nil) } }
这样一来,您就可以使用预期的语法提供或不提供限制:
let a = StopPoint.search(query: "Foobar") let b = StopPoint.search(query: "Foobar", limit: 5) let c = StopPoint.search(query: "Foobar", limit: nil) func foo(_ stop: StopPoint) { /* ... */ } foo(.search(query: "Foobar")) foo(.search(query: "Foobar", limit: 5)) foo(.search(query: "Foobar", limit: nil))
经过测试并确认可以使用Swift 4.2
我不认为这是可能的.这只是function
s的一个简洁特征.没有任何下面的实际元组支持.默认参数值的文档状态:
您可以通过在该参数的类型之后为参数赋值来为函数中的任何参数定义默认值.如果定义了默认值,则可以在调用函数时省略该参数.
枚举根本就没有这个功能.您必须明确使用不同的枚举元素来包含可选的其他参数:
enum StopPoint { case Search(String) case SearchLimit(String, Int) }
枚举非常强大但不强大.您不能使用默认值,例如,您可以不使用可变参数类型(可能更多"限制"):
enum StopPoint { case SearchMult(String...) // causes compile error }
关于"为什么"问题可能有趣:不知道,我不是那么深入地参与语言架构.