gpt4 book ai didi

swift - 满足具有协变类型属性的协议(protocol)要求

转载 作者:可可西里 更新时间:2023-11-01 01:25:55 27 4
gpt4 key购买 nike

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

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)组合类型都不能满足协议(protocol)要求。这似乎是编译器的一个相当古老(而且非常不幸)的限制(参见 https://bugs.swift.org/browse/SR-55 )。

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


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

最佳答案

Question: Are there any workarounds for this limitation?

你可以使用 associatedtypeP (符合 V )用作 v 的类型注释在 P ,并使用这个 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?
}

关于swift - 满足具有协变类型属性的协议(protocol)要求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41482226/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com