我在访问使用枚举传递的参数时遇到了一些问题。
通用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
参数中传递的值。这可能吗?我希望这很清楚:))
答案 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
}