gpt4 book ai didi

swift - 不符合协议(protocol)的属性(property)去哪儿了?

转载 作者:可可西里 更新时间:2023-11-01 02:16:45 28 4
gpt4 key购买 nike

Teacher & TeamMate 是两个协议(protocol)。 Coach 类符合这些协议(protocol)。

protocol Teacher {
var firstName: String { get }
var lastName: String { get }
var title: String { get }
}

protocol TeamMate {
var firstName: String { get }
func role()
}

class Coach: Teacher, TeamMate {
var firstName: String
var lastName: String
var title: String

func role() {
print("coach the team")
}

init(firstName: String, lastName: String, title: String){
self.firstName = firstName
self.lastName = lastName
self.title = title
}
}

var member: TeamMate = Coach(firstName: "Izumi", lastName: "Yakuza", title: "LA Coach")

我创建了一个名为 membercoach 变量,同时它符合 TeamMate 类型(请如果描述不准确,请纠正我)

当我创建member 对象时,我需要初始化Coach 类中定义的所有属性。即(firstName: "Izumi", lastName: "Yakuza", title: "LA Coach")。但是,最终,member 实例中只有一个属性 firstName 和一个方法 role()

enter image description here

问题如何处理属性(lastName: "Yakuza", title: "LA Coach")?它们是先被创造出来然后被切掉还是被隐藏起来?

非常感谢您的帮助和时间。

最佳答案

I've created a variable named member of type coach meanwhile it conforms to the TeamMate type

var member: TeamMate = Coach(firstName: "Izumi", lastName: "Yakuza", title: "LA Coach")

我怀疑这行代码并没有按照您的想法行事。你的member变量不是 Coach 类型,你已经向上转换为抽象类型 TeamMate (Coach 符合的协议(protocol))。因此,在使用您的变量时,您只能访问 TeamMate 的成员定义(firstNamerole())——这正是您所看到的行为。

除非你需要,否则你不应该向上转换你的变量,因为向上转换会丢失类型信息。在大多数情况下,你应该让 Swift 为你推断出正确的类型。在你的情况下 member几乎可以肯定是 Coach 类型(你总是可以自由地将它传递给任何需要 TeamMate 的东西,因为 Coach 符合这个协议(protocol))。

因此,您只想删除显式类型注释:

var member = Coach(firstName: "Izumi", lastName: "Yakuza", title: "LA Coach")

你还应该把它设为 let如果您不打算对其进行变异,则为常量。

关于swift - 不符合协议(protocol)的属性(property)去哪儿了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37610182/

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