关联类型作为属性的协议

Nom*_*sta 5 generics ios swift

是否可以使用具有关联类型的协议作为属性来匹配某些约束?

这是我正在努力解决的一个例子:

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
}
Run Code Online (Sandbox Code Playgroud)

Swe*_*per 7

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

class Owner<AnimalType> where AnimalType : Animal {
    var item: AnimalType.Item?
    var animal: AnimalType?
}
Run Code Online (Sandbox Code Playgroud)

您不需要,Item因为您可以仅用AnimalType.Item于此目的。这就是关联类型的工作方式。假设您想要一个接受 的函数Item,您可以使用它AnimalType.Item来代替:

func someFunc(someParameter: AnimalType.Item) { ... }
Run Code Online (Sandbox Code Playgroud)

或者这可能符合您的需求?

class Owner<AnimalType, ItemType> where AnimalType : Animal, AnimalType.Item == ItemType {
    var item: ItemType?
    var animal: AnimalType?
}
Run Code Online (Sandbox Code Playgroud)