【问题标题】:Why we don't have to provide properties default value within function body?为什么我们不必在函数体中提供属性默认值?
【发布时间】:2018-03-25 14:24:06
【问题描述】:

假设我已经覆盖了这个函数,并且在它的主体中我定义了没有默认值的属性

let identifier: String 

为什么 swift 允许我跳过为这个属性提供默认值?

    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let identifier: String
    if indexPath.item == 1 {
        identifier = trendingCellId

    } else if indexPath.item == 2 {
        identifier = subscriptionCellId
    } else {
        identifier = cellId
    }
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: identifier, for: indexPath)

            return cell
}

【问题讨论】:

标签: swift


【解决方案1】:

重要的是你已经给变量一个类型,并且你在下一行初始化了这个值。因此,声明是合法的。

这种构造称为“条件初始化”,允许您根据情况(条件)对变量进行不同的初始化。这是一个非常有用的特性,即使对于常量也是合法的。

【讨论】:

【解决方案2】:

一切都好,因为您在使用前对其进行了初始化。 ifelse ifelse 正在初始化该属性。您删除 else 部分然后编译器将显示错误。

【讨论】:

    【解决方案3】:

    在 Swift 中声明变量时不需要提供值 您可以稍后在代码中分配该值。 您应该在尝试访问它之前执行此操作,否则:

    • 非可选变量:出现运行时错误。
    • 可选变量:你得到零。

    【讨论】:

    • "否则为 NULL" – 不,它未初始化;值是未定义的。但是编译器会阻止你在变量初始化之前访问它,所以这不是一个真正的问题。
    • 这个答案的措辞令人困惑和误导。第一句应该声明“在Swift中声明变量时不需要提供值”。初始化是将第一个值分配给变量的行为。因此,在初始化变量时声明您不需要提供值是没有意义的。如果您尝试访问未初始化的变量,您不会得到NULL。相反,你会得到一个编译器错误。
    • 你是绝对正确的,@rmaddy。我改了句。
    • 你最后一句话还是错的。对于未初始化的变量,您不会在运行时获得NULL。如果你试图引用一个未初始化的变量,你实际上会得到一个编译器错误。
    • 嗯,是的。在他的情况下,这是非可选的,所以你是对的。尽管 afaik ,但可选项是 nil 。再次编辑我的帖子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 2019-01-02
    • 1970-01-01
    • 2014-07-23
    • 2018-11-10
    • 1970-01-01
    相关资源
    最近更新 更多