满足协变要求与协变类型的属性

时间:2017-01-05 10:11:27

标签: swift

我有一个具有属性要求的协议:

V

问题是只有class A: P { var v: V? } 类型的属性才能满足此要求。以下代码编译:

protocol Some: V {}

class B: P {
  var v: Some?
}

protocol Another {}

class C: P {
  var v: (Another & V)?
}

但以下情况并非如此:

order_id | pr1 | pr2 | pro3 | pro4 | price

AB5487   | on  | on  |      | on   | 120

AB5587   | on  | on  |  on  |      | 120

也就是说,协变和协议组合类型都不能满足协议要求。这似乎是编译器的一个旧的(并且非常不幸)限制(参见https://bugs.swift.org/browse/SR-55)。

问题:此限制是否有解决方法?

另一个问题:Swift问题跟踪器上有几个重复和相关问题,但它们似乎都没有完全匹配。发布此问题有什么意义吗?

1 个答案:

答案 0 :(得分:2)

  

问题:此限制是否有任何变通方法?

您可以使用associatedtype中的P {符合Vv作为Passociatedtype的类型注释,并使用此功能P作为符合protocol V {} protocol P { associatedtype T: V var v: T? { get } } /* typeholder conformance via protocol inheritance */ protocol Some: V {} class B<T: Some>: P { var v: T? } /* ... protocol composition */ protocol Another {} class C<T: Another & V>: P { var v: T? } 的类型的通用类型持有者。

'" & Lijn & "'