swift中enum case中的可选参数

时间:2015-12-24 18:17:32

标签: swift enums

在swift中,函数可以有一个可选参数,其默认值如下:

func f(a:Int, b:Int?=nil) {}

f(1);
f(1,2);

我想用枚举的相关值来做这件事。在这篇关于type safe url routes的帖子之后,我想要一个可以选择参数的路线,例如:

enum StopPoint {
    case Search(query:String, limit:Int?=nil)
}

然而它说我不能为元组中的参数设置默认值。但是,可能有case Arrivals(stopId:Int)这样的情况,但通常不可能有一个带有一个命名参数的元组。

那么有可能有一个带有默认参数的枚举,并且是一个元组的关联值吗?

4 个答案:

答案 0 :(得分:9)

你能做的是:

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))

答案 1 :(得分:5)

我认为这是不可能的。它只是function s的一个简洁特征。没有任何下面的实际元组支持。 Default Parameter Values州的文档:

  

您可以通过在该参数的类型之后为参数赋值来为函数中的任何参数定义默认值。如果定义了默认值,则可以在调用函数时省略该参数。

Enums根本就没有这个功能。您必须明确使用不同的枚举元素来包含可选的附加参数:

enum StopPoint {
    case Search(String)
    case SearchLimit(String, Int)
}

枚举功能非常强大但功能强大。您不能使用默认值,例如,您可以不使用可变参数类型(可能更多"限制" ):

enum StopPoint {
    case SearchMult(String...) // causes compile error
}

关于"为什么" -question可能有趣:不知道,我不是那么深入地参与语言架构。

答案 2 :(得分:3)

也许你已经考虑过这个并且打了折扣:你可以通过在枚举上创建一个静态函数来接近你所寻找的方便:

deleted_at

答案 3 :(得分:3)

您可以通过在枚举上创建与要允许使用可选参数的枚举大小写匹配的静态函数来实现此目的。

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