如何在接受 Any 的函数上添加 OR 泛型类型约束
How can I add an OR generic type constraint on a function that accepts Any
我有一个接受可变参数的初始化程序,但我希望参数只是以下两种类型之一:
- 一个习惯 class,比如说
MyCustomNSOperation
(MyCustomNSOperation, () -> Bool)
的元组
如何在 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()
}
}
}
我有一个接受可变参数的初始化程序,但我希望参数只是以下两种类型之一:
- 一个习惯 class,比如说
MyCustomNSOperation
(MyCustomNSOperation, () -> Bool)
的元组
如何在 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()
}
}
}