Swift 符合具有关联值的类型的协议

Swift 符合具有关联值的类型的协议,swift,protocols,Swift,Protocols,我得到了以下片段: 协议MyProtocol:可识别,其中ID==UUID{ 变量id:UUID{get} } var测试:[MyProtocol]=[] 协议“MyProtocol”只能用作泛型约束,因为它具有自身或关联的类型要求 为什么这样不行?where ID==UUID不应该消除与错误相关的歧义吗?我是不是遗漏了什么 我认为这个问题与这个问题类似: 然而,我会假设添加where ID==UUID应该解决这个问题?为什么不是这样 谢谢 编辑 因此,在使用SwiftUI和struct数据模型

我得到了以下片段:

协议MyProtocol:可识别,其中ID==UUID{ 变量id:UUID{get} } var测试:[MyProtocol]=[] 协议“MyProtocol”只能用作泛型约束,因为它具有自身或关联的类型要求

为什么这样不行?where ID==UUID不应该消除与错误相关的歧义吗?我是不是遗漏了什么

我认为这个问题与这个问题类似:

然而,我会假设添加where ID==UUID应该解决这个问题?为什么不是这样

谢谢

编辑 因此,在使用SwiftUI和struct数据模型进行实验时出现了这个问题。我一直在为任何类型的数据模型使用类,但似乎SwiftUI希望让您尽可能多地使用结构,我仍然不知道这在现实中是如何可能的,但这就是为什么我要尝试它

在这个特殊的例子中,我尝试使用一个包含所有符合MyProtocol的结构的管理器。例如:

协议MyProtocol:可识别,其中ID==UUID{ 变量id:UUID{get} } 结构A:MyProtocol{//第一个数据模型 变量id:UUID=UUID } 结构B:MyProtocol{//第二个数据模型 变量id:UUID=UUID } 类数据管理器:ObservableObject{ var myData:[MyProtocol] } ...
我实际上不必在MyProtocol上声明可识别,但我认为它会更好、更干净。

因为这不是Swift当前的功能。一旦存在关联类型,则始终存在关联类型。它不会因为你约束它而消失。一旦它有了关联的类型,它就不是具体的

没有办法以这种方式继承协议。你的意思是:

protocol MyProtocol {
    var id: UUID { get }
}
然后,您可以将可识别的对象附加到需要它的结构:

struct X: MyProtocol, Identifiable {
    var id: UUID
}
请注意,不需要where子句

现在没有Swift特性允许您说符合X的类型隐式符合Y。现在也没有Swift特性允许符合ID==UUID的可识别事物的数组。这叫做广义存在论,目前还没有


最有可能的情况是,您应该回到您的调用代码,并探索为什么需要这样做。如果您发布的代码在测试过程中迭代,并且特别需要可识别的一致性,那么我们可能会帮助您找到不需要该一致性的设计。

,因为这不是Swift当前的功能。一旦存在关联类型,则始终存在关联类型。它不会因为你约束它而消失。一旦它有了关联的类型,它就不是具体的

没有办法以这种方式继承协议。你的意思是:

protocol MyProtocol {
    var id: UUID { get }
}
然后,您可以将可识别的对象附加到需要它的结构:

struct X: MyProtocol, Identifiable {
    var id: UUID
}
请注意,不需要where子句

现在没有Swift特性允许您说符合X的类型隐式符合Y。现在也没有Swift特性允许符合ID==UUID的可识别事物的数组。这叫做广义存在论,目前还没有


最有可能的情况是,您应该回到您的调用代码,并探索为什么需要这样做。如果您发布的代码在测试中迭代,并且特别需要可识别的一致性,那么我们可能会帮助您找到一种不需要这种一致性的设计。

谢谢您的回答!我没有具体的用例,我只是在尝试使用结构而不是类的不同方法。我在问题上补充了一些信息,我认为你是对的。我的示例中的A和B是真实场景中的数据模型。我一直认为它们是直接推送到视图的视图模型。你说的有道理。我认为MyProtocol、A和B实际上应该是类,因为它们表示数据模型/层。对于SwiftUI视图,我将创建单独的视图模型结构,并使用这些数据模型类进行初始化;经过数周的尝试,我可能已经开始混合模型和视图模型,以实现数据一致性。使用我在上一篇评论中描述的方法,您会遇到保持视图模型同步的问题,因为它只是模型的副本。但我现在意识到你不必那么做。每当模型更改时,SwiftUI都会重新创建视图层次结构,从而重新创建视图模型结构。这有意义吗?如果是的话,那么你刚刚帮我解决了我所遇到的最令人沮丧的建筑问题:染料,我认为你在这方面走的正是正确的道路。Swift View的整个理念是它们被扔掉并重建。状态变量提供了状态的假象,但它们实际上只是在视图层次结构的实例之间被记住的东西。ViewModel的关键点不是掌握真理的来源;它就在那里
将模型的真实来源转换为视图想要的形状。但是:这在SwiftUI中还处于起步阶段。我们都在努力寻找在大型项目中真正有效的模式。即使是苹果也没有建立足够的模型来确定哪种模式最有效。所以这里没有什么是确定的,但这是我到目前为止发现的。谢谢你的回答!我没有具体的用例,我只是在尝试使用结构而不是类的不同方法。我在问题上补充了一些信息,我认为你是对的。我的示例中的A和B是真实场景中的数据模型。我一直认为它们是直接推送到视图的视图模型。你说的有道理。我认为MyProtocol、A和B实际上应该是类,因为它们表示数据模型/层。对于SwiftUI视图,我将创建单独的视图模型结构,并使用这些数据模型类进行初始化;经过数周的尝试,我可能已经开始混合模型和视图模型,以实现数据一致性。使用我在上一篇评论中描述的方法,您会遇到保持视图模型同步的问题,因为它只是模型的副本。但我现在意识到你不必那么做。每当模型更改时,SwiftUI都会重新创建视图层次结构,从而重新创建视图模型结构。这有意义吗?如果是的话,那么你刚刚帮我解决了我所遇到的最令人沮丧的建筑问题:染料,我认为你在这方面走的正是正确的道路。Swift View的整个理念是它们被扔掉并重建。状态变量提供了状态的假象,但它们实际上只是在视图层次结构的实例之间被记住的东西。ViewModel的关键点不是掌握真理的来源;它只是将模型的真实来源转换成视图想要的形状。但是:这在SwiftUI中还处于早期阶段。我们都在努力寻找在大型项目中真正有效的模式。即使是苹果也没有建立足够的模型来确定哪种模式最有效。所以这里没有什么是确定的,但这是我到目前为止发现的。