【发布时间】:2021-11-02 11:55:54
【问题描述】:
我有一个协议
protocol doSomethingProtocol {
associatedtype someType
}
然后我有实现这个协议的类
class doSomethingClass : doSomethingProtocol {
typealias someType = Int
}
现在我想在其他类中使用这个协议作为参考
class someClass : ObservableObject {
private var reference : doSomethingProtocol
}
现在我不能这样做,因为doSomethingProtocol 有一个关联类型。所以我决定使用some
class someClass : ObservableObject {
private var reference : some doSomethingProtocol
init(){
reference = doSomethingClass()
}
}
但是这不起作用。我收到错误Property declares an opaque return type, but has no initializer expression from which to infer an underlying type。为什么 ?我在类 init 中给它初始化表达式。
但是当我做这样的事情时
class someClass : ObservableObject {
private var reference : some doSomethingProtocol = doSomethingClass()
init(){}
}
我没有收到任何错误消息,它可以编译。为什么,两者有什么区别。
【问题讨论】:
-
在第一种情况下,类型未定义(即泛型),因此无法将具体分配给泛型 - 错误,在第二种情况下,类型是在初始化期间显式推断的。实际上,不清楚您要达到什么目的 - 您不能使用
doSomethingProtocol没有关联的类型特化。 -
@Asperi 对不起,我没有明白你想说什么。为什么编译器不能在第一种情况下推断出来,毕竟我在初始化程序中明确地为其分配了一个对象。
标签: swift protocols opaque-types