可以将T转换成swift中的协议

时间:2017-09-27 08:38:11

标签: swift generics casting

我想使用swift泛型代码如下所示:

func handle<T>(data: Data, with type: T.Type) {
    if type is B.Type {
        handleOne(data: data, with: type) //error here: In argument type 'T.Type', 'T' does not conform to expected type 'B'
        // cast T comform B?
    } else {
        handleTwo(data: data)
    }
}

func handleOne<T>(data: Data, with type: T.Type) where T:B {

}

func handleTwo(data: Data) {

}

...

protocol B {
    ...
}

B是一个协议,我可以在handleOne中致电handle吗?可以投射T投放B吗?

1 个答案:

答案 0 :(得分:2)

没有必要将类型作为参数传递,因为它可以从对象本身检索。 is类型检查运算符处理对象的实例并检查类型名称:

protocol A {}

protocol Data {}

func handle (data: Data) {
  if data is A {
    print("Handled A.")
  } else {
    print("Handled something else.")
  }
}

struct AStruct: Data, A {}

handle(data: AStruct()) // Handled A.