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

How can I add an OR generic type constraint on a function that accepts Any

我有一个接受可变参数的初始化程序,但我希望参数只是以下两种类型之一:

如何在 Swift 2.0 中实现这一点?我目前的初始化程序是这样写的,但我认为它过于宽松:

init(items: Any ...) {

}

在 class 的某处,我遍历所有项目,检查它们的类型,如果它不是我想要限制的两种类型之一,我将抛出一个 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(即,该项目必须符合 both 类型,不只是其中之一)。

我只是将这些对象抽象成一个协议并在您的 class 中使用它,并使用结构而不是元组:

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