【问题标题】:No need for initializer for optional properties inside Swift class [duplicate]Swift类中的可选属性不需要初始化器[重复]
【发布时间】:2019-11-23 08:57:56
【问题描述】:

为什么我们不需要 ViewController.swift 文件中的任何类中的可选属性的初始化程序?

class SpareParts {
    var wheels: Int8?
    var engine: String?
}

但如果类的属性是非可选的,我们立即需要一个 init() 方法:

【问题讨论】:

  • 可选属性默认值为nil。类具有默认初始化程序。如果所有属性都有可选值,则可以使用默认初始化程序。
  • 默认的 Swift 类初始化器是什么样的?
  • 目前 Swift 论坛正在讨论这个问题:forums.swift.org/t/…

标签: swift viewcontroller initializer


【解决方案1】:

可选属性类型:

如果您的自定义类型有一个逻辑上允许“无值”的存储属性——可能是因为它的值不能在初始化期间设置,或者因为它允许在稍后的某个时间点有“无值”——声明具有可选类型的属性。可选类型的属性会自动使用 nil 值进行初始化,这表明该属性在初始化期间故意设置为“还没有值”。

例如:

class SurveyQuestion {
    var text: String?
    init(text: String) {
        self.text = text
    }
    func ask() {
        print(text)
    }
}

let cheeseQuestion = SurveyQuestion(text: "Do you like cheese?")
cheeseQuestion.ask()
// Prints "Do you like cheese?"
 let cheeseQuestion1 = SurveyQuestion()
cheeseQuestion.ask() 
// Prints nil

【讨论】:

    【解决方案2】:

    我们不需要可选属性的初始化器

    因为它的默认值是 nil ,所以不能重新升级非可选的,所以你必须用 init 分配一个值或者得到一个编译时错误,就像你现在拥有的一样

    【讨论】:

    • 那么,正如@EmreCiftci 所说,没有所谓的default class initializer,对吧?
    • 可选的默认值是nil,所以它会编译,当你访问它时会打印 nil 不像非可选的,它应该知道在创建类实例时从哪里获取它的值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-17
    相关资源
    最近更新 更多