我有一个接受可变参数的初始值设定项,但我希望参数只能是两种类型之一:
MyCustomNSOperation
(MyCustomNSOperation, () -> Bool)
如何在Swift 2.0中实现这一目标?我目前的初始化程序是这样编写的,但我认为它过于宽松:
init(items: Any ...) {
}
在课堂的某个地方,我遍历所有项目,检查它们的类型,如果它不是我想要限制的两种类型之一,我会抛出一个fatalError
。
for i in 0..<self.items.count {
guard self.items[i] is MyCustomNSOperation || self.items[i] is (MyCustomNSOperation, () -> Bool) else {
fatalError("Found unrecognised type \(self.items[i]) in the operation chain")
}
}
如果是,我执行另一个函数的两个重载版本之一。
我也查看了协议组合,但强制执行的类型约束逻辑是AND,而不是OR(即,项目必须符合两个类型,而不仅仅是其中一个)。
答案 0 :(得分:1)
我只是将这些对象抽象为一个协议并在您的类中使用它,并使用结构而不是元组:
protocol MyItem {
func doSomething()
}
class MyCustomNSOperation: NSOperation, MyItem {
func doSomething() {
print( "MyCustomNSOperation is doing something..." )
}
}
struct OperationWithClosure: MyItem {
let operation: MyCustomNSOperation
let closure: () -> Bool
func doSomething() {
print( "OperationWithClosure is doing something..." )
}
}
class MyClass {
let items: [MyItem]
init(items: MyItem...) {
self.items = items
}
func doSomethingWithItems() {
for item in items {
item.doSomething()
}
}
}