Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 利用协变类型的性质满足协议要求_Swift - Fatal编程技术网

Swift 利用协变类型的性质满足协议要求

Swift 利用协变类型的性质满足协议要求,swift,Swift,我有一个协议,它有一个属性要求: protocol V {} protocol P { var v: V? { get } } 问题是只有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)? }

我有一个协议,它有一个属性要求:

protocol V {}

protocol P {
  var v: V? { get }
}
问题是只有
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)?
}
也就是说,协变或协议组合类型都不能满足协议要求。这似乎是编译器的一个非常古老(而且非常不幸)的限制(请参阅)

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


另一个问题:Swift issue tracker上有几个副本和相关问题,但没有一个与此完全匹配。发布这个问题有什么意义吗

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

您可以使用
p
中的
associatedtype
(符合
V
)作为
p
V
的类型注释,并将此
associatedtype
用作符合
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?
}
协议V{}
P方案{
关联类型T:V
var v:T?{get}
}
/*通过协议继承实现typeholder一致性*/
协议部分:V{}
B类:P{
var v:T?
}
/* ... 协议组成*/
协议另一{}
丙级:P{
var v:T?
}

上面
C
v
的类型注释是否应该是
(另一个&v)?
而不是
(另一个&P)?
?@dfri是的,你是对的,它应该是。