Swift 不符合协议的属性在哪里?
Swift 不符合协议的属性在哪里?,swift,initialization,protocols,Swift,Initialization,Protocols,老师和队友是两个协议。类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 {
老师
和队友
是两个协议。类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
,同时它符合队友类型(如果描述不准确,请更正我))
创建成员
对象时,我需要初始化Coach
类中定义的所有属性。例如,(名字:“Izumi”,姓氏:“Yakuza”,标题:“LA Coach”)
。但是,最后,成员
实例中只有一个属性firstName
和一个方法role()
问题:这些房产(姓:“黑帮”,标题:“LA Coach”
)是如何处理的?它们是先被创造,然后被剪掉,还是被隐藏
非常感谢你的帮助和时间
我已经创建了一个名为member的coach类型变量,同时它符合队友类型
我怀疑这行代码没有做你认为它在做的事情。您的成员
变量不是教练
类型,您已向上转换为抽象类型队友
(教练
遵守的协议)。因此,在使用变量时,您只能访问定义了(firstName
和role()
)的成员,这正是您看到的行为
除非需要,否则不应该向上转换变量,因为向上转换会丢失类型信息。在大多数情况下,您应该让斯威夫特为您推断正确的类型。在您的情况下,成员
几乎肯定属于教练
(您可以随时自由地将其传递给任何需要队友
,因为教练
符合此协议)
因此,您只需要删除显式类型注释:
var member = Coach(firstName: "Izumi", lastName: "Yakuza", title: "LA Coach")
如果您不打算对其进行变异,您还应该将其设置为一个
常量。当您向上转换到队友(成员:队友)时,您正在删除此类型信息,因为该协议仅定义名字和角色()。是否有理由会员
不能只是属于教练类型
?向上转换将始终丢失类型信息,因此除非需要,否则不应执行该操作。@originaluser2否,不是特定原因。这不是项目代码。我是为自学而生的。向上投射总是会丢失类型信息,这正是我要寻找的答案。我甚至不知道这个过程叫做“向上投射”。非常感谢你的解释。非常感谢你的帮助和解释。除非你需要,否则你不应该向上投射你的变量。很高兴知道这一点@SLN很乐意提供帮助:)如果您计划将符合公共协议的不同类型(即队友的数组
)混合在一起,则向上转换可能很有用,但它很少对单个变量有用,因为您总是可以将更具体的类型传递给期望其符合(或继承)的类型。
var member = Coach(firstName: "Izumi", lastName: "Yakuza", title: "LA Coach")