【问题标题】:Swift inheritance and classesSwift 继承和类
【发布时间】:2020-05-15 14:05:52
【问题描述】:

我正在自己学习 swift,但我无法让这段代码运行,我正在尝试创建一个从 Person 类继承的具有新的“Country”属性的类“Inhabitant”,有 2 个初始化程序: - 接受名字和姓氏并将国家/地区设置为空字符串 - 一个需要名字、姓氏和国家的 并创建一个 String 类型的计算属性描述,返回由空格分隔的名字、姓氏和国家/地区

class Person {
    var firstname: String
    var lastname: String
    var fullname: String {
        return firstname + " " + lastname
    }

    init(firstname: String, lastname: String) {
        self.firstname = firstname
        self.lastname = lastname
    }
}

    class Inhabitant: Person {
    var country: String? = nil
    var description: String {
        return firstname + " " + lastname + " " + country ?? ""
    }
    override init(firstname: String, lastname: String) {
        super.init(firstname: <#T##String#>, lastname: <#T##String#>)
        self.country = ""
    }
    init(firstname: String, lastname: String, Country: String) {
        super.init(firstname: <#T##String#>, lastname: <#T##String#>)
    }
}

func tst() {
    let perso = Inhabitant(firstname: "toto", lastname: "bobo")
    print(perso)
}

代码不会运行:

Editor placeholder in source file

【问题讨论】:

  • &lt;#T##String#&gt; 更改为某个字符串。简单的方法是选择它并输入它是否仍然是“实时”占位符;否则你只需要手工完成。了解 Xcode 的“自动完成”功能。你想要的是firstnamelastname 这里。换句话说,您只想将传入的firstnamelastname 值沿继承链向上传递到super.init 调用。
  • 在 Xcode 中,看到super.init(firstname: 后面的单词String?那是一个“编辑器占位符”。你需要用一些东西来代替它。
  • @Sweeper 感谢您重置我的大脑 - 这里是清晨!
  • 但是我为什么要更换它呢?我想在 tst 函数中调用这个字符串,而不是在初始化程序中
  • 您需要将变量传递到这些占位符所在的位置。即super.init(firstname: firstname, lastname: lastname)

标签: ios swift class inheritance


【解决方案1】:

我会这样做:

class Person {
    var firstname: String
    var lastname: String
    var fullname: String {
        return firstname + " " + lastname
    }

    init(firstname: String, lastname: String) {
        self.firstname = firstname
        self.lastname = lastname
    }
}

class Inhabitant: Person {
    var country: String? = nil
    var description: String {
        //1
        return "\(firstname) \(lastname) \(country ?? "")"
    }
    override init(firstname: String, lastname: String) {
        //2
        super.init(firstname: firstname, lastname: lastname)
        self.country = ""
    }
    init(firstname: String, lastname: String, country: String) {
        super.init(firstname: firstname, lastname: lastname)
        self.country = country
    }
}

func tst() {
    let perso = Inhabitant(firstname: "toto", lastname: "bobo")
    let perso2 = Inhabitant(firstname: "toto", lastname: "bobo", country: "Belgium")
    print(perso.fullname)
    print(perso2.description)
}

tst()

说明:

  1. swift 中的字符串插值是使用这种语法完成的,参见swift programming language
  2. 当您覆盖初始化程序时,您需要将收到的参数传递给您的超级初始化程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    • 1970-01-01
    • 1970-01-01
    • 2014-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多