为啥我们不必在函数体中提供属性默认值?

Posted

技术标签:

【中文标题】为啥我们不必在函数体中提供属性默认值?【英文标题】: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

【问题讨论】:

另见***.com/a/28444671/1187415。 【参考方案1】:

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

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

【讨论】:

在我的讨论中涉及:apeth.com/swiftBook/ch03.html#_variable_declaration 非常感谢!所以如果我不使用这个属性(但不管你为什么输入那个字符串(让标识符:字符串))它结果是合法的?【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

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

以上是关于为啥我们不必在函数体中提供属性默认值?的主要内容,如果未能解决你的问题,请参考以下文章

golang函数中的参数为啥不支持默认值

在 SwiftUI 中使用泛型作为函数属性的默认值

C++中,为啥函数参数不够也可以调用?而且函数模板定义中没有提供默认值。

当我的类中有属性具有默认构造函数来提供值自动映射器时,如何映射?

golang函数中的参数为啥不支持默认值

如何在 HAML 中为本地人使用默认值?