如何在接受Any的函数上添加OR泛型类型约束

时间:2015-07-29 07:48:38

标签: ios iphone swift foundation

我有一个接受可变参数的初始值设定项,但我希望参数只能是两种类型之一:

  • 自定义类,例如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(即,项目必须符合两个类型,而不仅仅是其中一个)。

1 个答案:

答案 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()
        }
    }
}