Swift 等同于字符串文字接口? -`请求(方法:'post'|'put')`

Swift equivalent of string literal interfaces? - `request(method: 'post'|'put')`

在 TypeScript 中我可以做这样的事情 [docs]:

request(method: 'post'|'put')

但在 Swift 中,我正在编写错误的代码,例如:

// See RFC7231 and RFC5789 for more info
enum HttpMethods: String {
    case GET = "GET"
    case HEAD = "HEAD"
    case POST = "POST"
    case PUT = "PUT"
    case DELETE = "DELETE"
    case CONNECT = "CONNECT"
    case OPTIONS = "OPTIONS"
    case TRACE = "TRACE"
    case PATCH = "PATCH"
}

如何在编译时限制 Swift 函数的允许输入?

您 Swift 的大写错误。你的意思可能是:

enum HTTPMethod: String {
    case get = "GET"
    case head = "HEAD"
    case post = "POST"
    case put = "PUT"
    case delete = "DELETE"
    case connect = "CONNECT"
    case options = "OPTIONS"
    case trace = "TRACE"
    case patch = "PATCH"
}

如果小写字符串常量没问题,就像您在 Typescript 中所做的那样,您可能会以这种方式编写它以获得相同的结果。 String 枚举自动是它自己的值。

enum HTTPMethods: String {
    case get, head, post, put, delete, connect, options, trace, patch
}

如果您想要使用小写的常量名称,但想要使用大写的字符串值,那么您需要使用第一个版本。

要使用它来限制参数,您只需使用类型:

func request(method: HTTPMethod)

概览:

  • 使用 OptionSet 支持多个值。

代码:

struct HTTPMethod : OptionSet {

    let rawValue : Int

    static let get      = HTTPMethod(rawValue: 1 << 0)
    static let head     = HTTPMethod(rawValue: 1 << 1)
    static let post     = HTTPMethod(rawValue: 1 << 2)
    static let put      = HTTPMethod(rawValue: 1 << 3)
    static let delete   = HTTPMethod(rawValue: 1 << 4)
    static let connect  = HTTPMethod(rawValue: 1 << 5)
    static let trace    = HTTPMethod(rawValue: 1 << 6)
    static let patch    = HTTPMethod(rawValue: 1 << 7)
}

func doSomething(method: HTTPMethod) {


}

doSomething(method: [.get, .head, .put])

参考: