Teacher
& TeamMate
是两个协议。类Coach
符合这些协议。
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")
我创建了一个名为member
且类型为coach
的变量,同时它符合TeamMate
类型( 如果描述不准确,请更正我< / EM> )
当我创建Coach
对象时,我需要初始化member
类中定义的所有属性。即。(firstName: "Izumi", lastName: "Yakuza", title: "LA Coach")
。但是,最后,firstName
实例中只有一个属性role()
和一个方法member
。
问题:如何处理属性(lastName: "Yakuza", title: "LA Coach"
)?是他们是先创建然后切掉还是隐藏?
非常感谢您的帮助和时间。
答案 0 :(得分:1)
我创建了一个名为member的成员类型的变量,同时它符合TeamMate类型
var member: TeamMate = Coach(firstName: "Izumi", lastName: "Yakuza", title: "LA Coach")
我怀疑这行代码并没有按照您的想法行事。您的member
变量不属于Coach
类型,您已向上转换为抽象类型TeamMate
(Coach
符合的协议)。因此,在使用您的变量时,您只能访问TeamMate
定义的成员(firstName
和role()
) - 这是您正在看到的确切行为。
除非您需要,否则不应该更新您的变量,因为向上转换会丢失类型信息。在大多数情况下,您应该让Swift为您推断出正确的类型。在您的情况下,member
几乎肯定属于Coach
类型(您可以随时将其自由传递给期望TeamMate
的任何内容,因为Coach
符合此协议。)
因此,您只想删除显式类型注释:
var member = Coach(firstName: "Izumi", lastName: "Yakuza", title: "LA Coach")
如果你不打算改变它,你也应该使它成为let
常数。