如何在Swift 3中访问传递的Enum参数

时间:2017-03-22 17:25:33

标签: swift

我在访问使用枚举传递的参数时遇到了一些问题。

通用RequestType,将包含更多。

enum RequestType {
  case flagging(api : FlaggingRequestType)
}

这是我的枚举,它接受另一个FlaggingRequestType(另一个接受字符串参数的枚举)

enum FlaggingRequestType {
  case getFlag(api : String)
}

protocol Requestable {
  var requestType : RequestType { get set }
}

这里我构建了标记请求

let flaggingRequest = RequestBuilder.buildFlaggingRequest(flagRequest: .getFlag(api: "http://www.apiworld.com"))

这是我从另一个方法实际发送请求的方法。

func sendRequest(for apiRequest : Requestable) {
  switch apiRequest.requestType {
  case .flagging:
  self.flaggingAPI(for: apiRequest)
 }
}

问题是,我无法弄清楚如何访问api / apiRequest中找到的flaggingRequest参数中传递的值。这可能吗?我希望这很清楚:))

3 个答案:

答案 0 :(得分:11)

以下是包含相关值https://appventure.me/2015/10/17/advanced-practical-enum-examples/#sec-1-5

的枚举的绝佳链接
func sendRequest(for apiRequest : Requestable) {
    switch apiRequest.requestType {
    case .flagging(let api):
        // access api value here
        self.flaggingAPI(for: apiRequest)
    }
}

答案 1 :(得分:4)

"嵌套"模式匹配&值绑定:case .one(.two(let val))

如果对于符合Requestable的类型的给定实例,您的单个目标是访问"内部"的相关String值。 FlaggingRequestType实例(对于已知的内部case),您可以在单个case中使用嵌套模式匹配和绑定,例如不仅用于switch购买,例如if声明。

// your example setup
enum FlaggingRequestType {
    case getFlag(api : String)
}

protocol Requestable {
    var requestType : RequestType { get set }
}

enum RequestType {
    case flagging(api : FlaggingRequestType)
}

// dummy type conforming to 'Requestable'
struct Foo : Requestable {
    var requestType: RequestType =
        .flagging(api: .getFlag(api: "http://www.apiworld.com"))
}

// Q: how to find the nested "http://www.apiworld.com" String
//    from a 'Foo' instance?
let foo = Foo()

// A: use nested pattern matching, e.g. in a single 'if' statement
if case .flagging(.getFlag(let api)) = foo.requestType {
    print(api) // http://www.apiworld.com
}

switch语句的情况下,您也可以自然地使用嵌套模式匹配:

switch foo.requestType {
case .flagging(.getFlag(let api)): print(api) // http://www.apiworld.com
// ...
default : () // in non-exhaustive pattern matching above
}

如果FlaggingRequestType的不同类型的关联值具有相同的类型,并且具有相同的预期用法,则此嵌套绑定可以是几个嵌套的switch语句的有用替代。例如,如果将上面的示例设置扩展到:

enum FlaggingRequestType {
    case getFlag(api : String)
    case getHandle(api : String)
    case getId(id: Int)
}

我们可以在单个switch语句中应用嵌套模式匹配,其中一个case可以覆盖内部枚举的几个不同情况的绑定关联值,前提是这些关联值具有相同的类型

switch foo.requestType {
case .flagging(.getFlag(let api)),
     .flagging(.getHandle(let api)): print(api) // api is 'String', a flag or a handle
case .flagging(.getId(let id)):      print(id)  // id is 'Int'
// ...
default : () // in case of non-exhaustive pattern matching above
}

最后,请注意,您可能需要考虑为sendRequest方法使用类型约束泛型,而不是键入要用作类型的协议。

func sendRequest<T: Requestable>(for apiRequest : T) { /* ... */ }

答案 2 :(得分:2)

由于它是嵌套的,你必须做嵌套的开关案例,如下所示:

switch apiRequest {
case .flagging(let value):
    switch value {
    case .getFlag(let api):
        print(api) // api is the string passed in the associated value
        break
    }
    break
}