怎么做使用if-let在Swift中键入擦除?

时间:2017-10-28 12:57:54

标签: swift

我看到很多关于类型擦除的文章。但是他们的大部分例子都集中在将不同的类型放入数组中。

有什么方法可以让这段代码起作用吗?

protocol A {
    associatedtype Data
    func printThis(value: Data)
}
class B {

}

let x = B()
if let y = x as? A {  // I get error on this line
    // Do nothing
}

Xcode错误状态 Protocol 'A' can only be used as a generic constraint because it has Self or associated type requirements

此示例代码仅用于演示目的。

1 个答案:

答案 0 :(得分:2)

从Swift 4开始,具有关联类型要求的协议只能 在函数声明中用作通用约束,如:

func foo<T: A>(t: T) where A.Data: Whatever { ... }

除非从协议中删除关联类型,否则不能只为其键入变量;您只能 使用它来定义泛型类型。

如果斯威夫特在将来获得了普遍存在的能力,那么这可能会改变。但就目前而言,这在Swift中是不可能的。