是否可以使用具有相关类型的协议作为属性来匹配某些约束?下面是一个我一直在纠结的例子:
protocol Animal { associatedtype Item func doSomething(with item: Item) } class Owner<Item> { var item: Item // I have to be sure that Animal.Item == Item var animal: Animal }
2mbi3lxu1#
具有关联类型的协议不能用作属性的类型。您可以尝试约束Owner的泛型类型,而不是约束animal的类型:
Owner
animal
class Owner<AnimalType> where AnimalType : Animal { var item: AnimalType.Item? var animal: AnimalType? }
你不需要Item,因为你可以直接用AnimalType.Item来实现它。这就是关联类型的工作方式。假设你想要一个接受Item的函数,你可以用AnimalType.Item来代替它:
Item
AnimalType.Item
func someFunc(someParameter: AnimalType.Item) { ... }
或者这可能符合你的需要?
class Owner<AnimalType, ItemType> where AnimalType : Animal, AnimalType.Item == ItemType { var item: ItemType? var animal: AnimalType? }
oprakyz72#
在Swift 5.7中,现在有一个“主”associatedtype的概念,它允许您这样做:
associatedtype
protocol Animal<Item> { associatedtype Item func doSomething(with item: Item) }
然后将其设置为如下所示的属性:
class Owner<Item> { var item: Item var animal: any Animal<Item> }
请参阅https://www.donnywals.com/what-are-primary-associated-types-in-swift-5-7/
2条答案
按热度按时间2mbi3lxu1#
具有关联类型的协议不能用作属性的类型。您可以尝试约束
Owner
的泛型类型,而不是约束animal
的类型:你不需要
Item
,因为你可以直接用AnimalType.Item
来实现它。这就是关联类型的工作方式。假设你想要一个接受Item
的函数,你可以用AnimalType.Item
来代替它:或者这可能符合你的需要?
oprakyz72#
在Swift 5.7中,现在有一个“主”
associatedtype
的概念,它允许您这样做:然后将其设置为如下所示的属性:
请参阅https://www.donnywals.com/what-are-primary-associated-types-in-swift-5-7/