gpt4 book ai didi

Swift - 为什么协议(protocol)仍然被视为通用的,即使 where 子句已经专门化了关联类型?

转载 作者:可可西里 更新时间:2023-11-01 01:56:50 26 4
gpt4 key购买 nike

我有一个通用协议(protocol):

protocol GenericProtocol {
associatedtype GenericParameter
}

我不能像这样使用它:

var someValue: GenericProtocol?

我收到众所周知的错误消息:

Protocol 'GenericProtocol' can only be used as a generic constraint because it has Self or associated type requirements

多次遇到这个错误并花了很长时间思考这个错误的概念原因,我想我至少已经掌握了一些。我不明白的是,为什么我不能创建一个继承自并专门化我的通用协议(protocol)的协议(protocol),以便它可以用于类型签名。这是继承协议(protocol):

protocol ConcreteProtocol: GenericProtocol where GenericParameter == Bool { }

但即使这样我也不能在类型签名中使用:

var someValue: ConcreteProtocol?

Protocol 'ConcreteProtocol' can only be used as a generic constraint because it has Self or associated type requirements

我是否误解了 where 子句的含义?即使是受约束的子协议(protocol)也必须被视为通用的概念原因是什么?我确信这不是一个错误,而是 Swift 社区已知的语言的一个有目的的事实。谁能给我解释一下?

此外,如果有人能提供一种方法让我可以实现我想要的,我将不胜感激,尽管我不确定这是否可能。

最佳答案

var someValue: GenericProtocol?

如果你想尝试一下,为什么这行不通就很明显了

var someValue: Class = Class1()
someValue = Class2()

关键是你有一个协议(protocol),它为你分配的每种类型都不同,例如有不同的方法类型,这使得 someValue 不可用。

protocol ConcreteProtocol: GenericProtocol where GenericParameter == Bool { }
var someValue: ConcreteProtocol?

可能不起作用,因为类可能想要覆盖 associatedtype,因此无法分配给 someValue。因此,在语言中实现这一点可能会拒绝覆盖类,因为 ConcreteProtcol 已经可以在其扩展之一中使用 GenericParameter == Bool

关于Swift - 为什么协议(protocol)仍然被视为通用的,即使 where 子句已经专门化了关联类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52200655/

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