Swift 可选初始化
Swift optional initialisation
据我了解
var perhapsInt : Int?
这会自动设置为 .None
值。下面的代码片段确认(没有编译器错误)
class MyClass {
var num1: Int = 0
var num2: Int?
init(num1: Int) {
self.num1 = num1
}
}
var newClass = MyClass(num1: 5)
newClass.num1 // prints '5'
newClass.num2 // prints 'nil'
我对可选初始化过程的理解是否正确?如果是这样,为什么当我将 num2
更改为 let
时这不起作用。
我期望在使用 let
时选项默认为 nil
的相同行为。我在这里遗漏了什么吗?
class MyClass {
var num1: Int = 0
let num2: Int?
init(num1: Int) {
self.num1 = num1
// compiler error : return from initialiser without initialising all stored properties
}
}
...
我的问题是,这两种情况怎么可能都是真的。不应该是一个或另一个。可选值要么自动设置为 .None
,要么不是。
我认为很多讨论是here。
来自该线程的声明 - 在上面的 link
中深入了解
The value of a constant doesn’t need to be known at compile time, but
you must assign it a value exactly once.
有趣的是,如果您设置如下 let 值,您的代码将编译:
let num2: Int? = .None
let num2: Int? = nil
var num2: Int?
的行为是由 Optional
以糖为动力造成的。它们是 Swift 中唯一具有 隐式 默认值(.None
)的类型。
请注意,如果您键入 var num2: Int
(没有 ?
)——无论使用 var
还是 let
,编译器都会抛出相同的错误。
class MyClass {
var num2: Int
init() {
// Return from initializer without initializing all stored properties
}
}
因为 let
s 的值无法被覆盖(与 var
s' 相反),它们需要您 明确地 设置它们的初始值:
class MyClass {
let num2: Int? = nil
}
// or this way
class MyClass {
let num2: Int?
init() {
num2 = nil
}
}
然而,这将导致无用的 nil
常量。
据我了解
var perhapsInt : Int?
这会自动设置为 .None
值。下面的代码片段确认(没有编译器错误)
class MyClass {
var num1: Int = 0
var num2: Int?
init(num1: Int) {
self.num1 = num1
}
}
var newClass = MyClass(num1: 5)
newClass.num1 // prints '5'
newClass.num2 // prints 'nil'
我对可选初始化过程的理解是否正确?如果是这样,为什么当我将 num2
更改为 let
时这不起作用。
我期望在使用 let
时选项默认为 nil
的相同行为。我在这里遗漏了什么吗?
class MyClass {
var num1: Int = 0
let num2: Int?
init(num1: Int) {
self.num1 = num1
// compiler error : return from initialiser without initialising all stored properties
}
}
...
我的问题是,这两种情况怎么可能都是真的。不应该是一个或另一个。可选值要么自动设置为 .None
,要么不是。
我认为很多讨论是here。 来自该线程的声明 - 在上面的 link
中深入了解The value of a constant doesn’t need to be known at compile time, but you must assign it a value exactly once.
有趣的是,如果您设置如下 let 值,您的代码将编译:
let num2: Int? = .None
let num2: Int? = nil
var num2: Int?
的行为是由 Optional
以糖为动力造成的。它们是 Swift 中唯一具有 隐式 默认值(.None
)的类型。
请注意,如果您键入 var num2: Int
(没有 ?
)——无论使用 var
还是 let
,编译器都会抛出相同的错误。
class MyClass {
var num2: Int
init() {
// Return from initializer without initializing all stored properties
}
}
因为 let
s 的值无法被覆盖(与 var
s' 相反),它们需要您 明确地 设置它们的初始值:
class MyClass {
let num2: Int? = nil
}
// or this way
class MyClass {
let num2: Int?
init() {
num2 = nil
}
}
然而,这将导致无用的 nil
常量。