ios 以相关类型作为属性的通信协定

bjp0bcyl  于 2022-11-19  发布在  iOS
关注(0)|答案(2)|浏览(124)

是否可以使用具有相关类型的协议作为属性来匹配某些约束?
下面是一个我一直在纠结的例子:

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
}
2mbi3lxu

2mbi3lxu1#

具有关联类型的协议不能用作属性的类型。您可以尝试约束Owner的泛型类型,而不是约束animal的类型:

class Owner<AnimalType> where AnimalType : Animal {
    var item: AnimalType.Item?
    var animal: AnimalType?
}

你不需要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?
}
oprakyz7

oprakyz72#

在Swift 5.7中,现在有一个“主”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/

相关问题