【发布时间】:2018-08-26 05:31:34
【问题描述】:
考虑下面的代码。它允许您通过传入可以处理有效负载的闭包来实例化处理器。闭包可以是六种签名类型之一。以下是我的实现方式:
我想知道是否有更简单/更好的方法来写这个。我可能正在考虑使用具有关联值的枚举,但这意味着我必须将闭包包装在枚举中,然后将枚举传递给初始化程序。我希望尽可能避免这种情况。
struct Payload {
let stringVal : String
let intVal : Int
}
class Processor{
init(action:Any){
switch action {
case let action as () -> Void,
let action as () -> Error?,
let action as (String) -> Void,
let action as (String) -> Error?,
let action as (Int) -> Void,
case let action as (Int) -> Error?,
default: fatalError("Action does not have a supported signature")
}
self.action = action
}
let action:Any
func performAction(payload:Payload) -> Error? {
switch action {
case let action as () -> Void:
action()
case let action as () -> Error?:
return action()
case let action as (String) -> Void:
action(payload.stringVal)
case let action as (String) -> Error?:
return action(payload.stringVal)
case let action as (Int) -> Void:
action(payload.intVal)
case let action as (Int) -> Error?:
return action(payload.intVal)
default: fatalError("Action does not have a supported signature")
}
return nil
}
}
另外,在我执行模式匹配以确定我是否有有效匹配的初始化程序中,我收到一个编译器警告,说我已经设置,但从未使用过action。但是,如果我将其替换为 _,则会收到一条警告,指出我没有绑定到模式中的任何内容。如何在对我不关心值是什么的模式执行测试的同时抑制警告?
【问题讨论】:
-
我认为具有关联类型的枚举将是正确的方法。
-
是的,这也是我不断返回的内容。但是如果我走那条路,有没有办法仍然将
Any传递给初始化程序并映射到里面的正确枚举?我问是因为枚举在函数之外在技术上没有任何意义,唯一的例外是给初始化器一个包装器。
标签: swift pattern-matching swift4