Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 不符合协议的属性在哪里?_Swift_Initialization_Protocols - Fatal编程技术网

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")