gpt4 book ai didi

swift - 如何符合声明类型协议(protocol)属性的协议(protocol)?

转载 作者:搜寻专家 更新时间:2023-10-31 22:20:21 25 4
gpt4 key购买 nike

我正在尝试创建一个协议(protocol)和几个符合它的类。该协议(protocol)有一个符合另一个协议(protocol)的属性,因此每个类都需要有一个匹配的属性。

这是(类似的)我目前正在尝试的:

protocol Edible {
func eat()
}

class Apple:Edible {
func eat() {
print("Crunch")
}
}

class Banana:Edible {
func eat() {
print("Homph")
}
}

protocol Delicious {
func consume()

var fruit: Edible? { get set }
}

class ToffeeApple: Delicious {
func consume() {
print("I like toffee apples!")
fruit.eat()
// ...
}

var fruit: Apple?
}

class BananaSplit: Delicious {
func consume() {
print("Ah! A banana split!")
fruit.eat()
// ....
}

var fruit: Banana?
}

我得到的(相关)错误是“Type 'ToffeeApple' does not conform to protocol 'Delicious'”(对于 Banana 和 BananaSplit 也是如此)。我认为属性 AppleBanana 会满足要求,因为它们都符合 Ediblefruit 一样。我是否错误地声明了其中之一,或者这是不可能的?

非常感谢。

最佳答案

只需更改:

protocol Delicious {
func consume()

var fruit: Edible? { get set }
}

到:

protocol Delicious {
func consume()

associatedtype EdibleType: Edible
var fruit: EdibleType? { get set }
}

associatedtype EdibleType: Edible 表示:

协议(protocol) Delicious 有一个未提供的类型 EdibleType 确认协议(protocol) Edible

并且当某些东西被确认为 Delicious 时应该提供类型。

所以在:

class ToffeeApple: Delicious {
func consume() {
print("I like toffee apples!")
fruit.eat()
// ...
}

typealias EdibleType = Apple
var fruit: Apple?
}

EdibleType 填充类型Apple,

并在:

class BananaSplit: Delicious {
func consume() {
print("Ah! A banana split!")
fruit.eat()
// ....
}

typealias EdibleType = Banana
var fruit: Banana?
}

EdibleType 填充类型Banana,

如果您想了解更多相关信息,可以搜索 Swift Generics。

关于swift - 如何符合声明类型协议(protocol)属性的协议(protocol)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39720532/

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