初始化期间的 Swift 可选值防止默认初始化程序继承

标签 swift initialization constants option-type swift-playground

在 Swift 中:

1) 如果您为类中所有存储的属性提供默认值,那么您将继承默认初始化程序,即 - init()

-- 和 --

2) 任何可选类型的属性默认值为 nil,即 - var shouldBeNill: String?//最初应该是空的

-- 因此 --

我希望这段代码能够工作:

class Product {
    let name: String?
}

let product = Product()

但是当我将它作为 Playground 输入时,我收到错误消息:“类 Product 没有初始化程序”。

为什么 Product 不继承默认初始化器 init()?我知道我可以通过显式设置 let name: String? = nil,但我不确定为什么我必须这样做。这是 Swift 方面的错误,还是我不太了解的地方?

最佳答案

您走在正确的轨道上。这里的问题实际上是 let vs var

let 声明属性常量。在这种情况下,Product 将有一个类型为 String 的可选常量 name,没有初始值,这当然没有意义。

编译器提示缺少 init() 函数,因为 let 属性允许在 init() 期间设置一次,作为对象构造的一部分,如果未定义已经在声明中,例如。

let name: String = "Im set!" // OK
let name: String? = nil // OK, but very weird :) 
let name = "Im set!" // OK, type not needed, implicit.
let name: String // OK, but needs to be set to a string during init()
let name: String? // OK, but needs to be set to string or nil during init()

let name // Not OK

The Swift Programming Language - 常量和变量

关于初始化期间的 Swift 可选值防止默认初始化程序继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30650874/

相关文章:

ios - SKTileMapNode:创建无限大小的瓦片 map

swift - 在表格 View 单元格中使用按钮出列单元格

c - 结构和常量结构

c# - 声明具有空值的用户定义类型常量有什么用?

c - C 中涉及常量的算术表达式类型

swift - 将 UIBezierPath 快速转换为 PKStrokePath

swift - 在 Firebase 中一段时间​​后更改值

c++ - 我可以防止对非 POD 类中的数组数据成员中的元素进行零初始化吗?

c++ - 创建类实例时,使用()和不使用()有什么区别

c - 将每个成员初始化为一个空的 C 字符串