不符合协议的财产在哪里?

时间:2016-06-03 09:02:44

标签: swift initialization protocols

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

enter image description here

问题:如何处理属性(lastName: "Yakuza", title: "LA Coach")?是他们是先创建然后切掉还是隐藏?

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

1 个答案:

答案 0 :(得分:1)

  

我创建了一个名为member的成员类型的变量,同时它符合TeamMate类型

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

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

除非您需要,否则不应该更新您的变量,因为向上转换会丢失类型信息。在大多数情况下,您应该让Swift为您推断出正确的类型。在您的情况下,member几乎肯定属于Coach类型(您可以随时将其自由传递给期望TeamMate的任何内容,因为Coach符合此协议。)

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

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

如果你不打算改变它,你也应该使它成为let常数。