我会使用一个协议(比如:“解析器”)来定义一个描述解析器可以做什么的接口。例如:解析(数据);
此协议的不同实现(A、B、C……)将有自己的代码来处理解析。
解析控制器(或管理器或您想出的任何名称)将存储Parser 对象的数组。
在一个forEach循环中,你可以调用每个try Parser.parse(data); …如果解析正常,则处理进入下一个或中止。
解析器的特定实现(A、B、C……)与调用者无关(应该如此)。 ParsingController(你现在有你的开关),不会关心会发生什么。它只对成功或失败感兴趣,分别停止或尝试下一个(如果有下一个)。
更新:我创建了一个小的 Playground 代码,您可以粘贴并了解我的意思。
UPDATE2:我添加了一个扩展协议,因此您可以了解如何使用类似于 abstract 类的东西来拥有一组基本/通用的函数/值。
import Swift
protocol Parser {
func parse(code1: Int, code2: Int) -> Bool
}
extension Parser {
var someCalculatedProperty: Int {
return 12345
}
func someCommonMethod() {
print("Some Common Method")
}
}
class A : Parser {
func parse(code1: Int, code2: Int) -> Bool { return false }
}
class B : Parser {
func parse(code1: Int, code2: Int) -> Bool { return false }
}
class C : Parser {
func parse(code1: Int, code2: Int) -> Bool { return true }
}
// Create 4 Parsers (two of the same type, just to demonstrate)
var parsers = [Parser](arrayLiteral: A(), A(), B(), C())
// Iterate the parsers until we get a success
for parser in parsers {
if parser.parse(0, code2: 1) {
print("Success")
// Just for fun, call common parser methods.
parser.someCommonMethod()
print(parser.someCalculatedProperty)
break
} else {
print("Fail")
}
}
输出应该是:
Fail
Fail
Fail
Success
Some Common Method
12345
3 个失败(因为 A、A、B 返回 false)和 Success 因为 C 返回 true。然后是常用方法的输出。