在 Swift 中,当我声明一个非可选的 属性 但不能保证初始化时,我是否会丢失任何资源?
In Swift, am I losing any resources when I declare a non-optional property but initialization isn't guaranteed?
所以我正在使用两个属性,一个是数组,一个是 Realm 的自定义容器类型 Results
(其行为类似于 List<T>
):
var rowHeights: [CGFloat?]!
var myResults: Results<ChildObject>!
在这两种情况下,我都需要全局声明它们,我只能在viewWillAppear()
后面初始化它们,这意味着从技术上讲,就Swift而言,初始化是'保证:
override func viewWillAppear(_ animated: Bool) {
...
myResults = myParentObject.children.sorted(byKeyPath: "childPath", ascending: true)
...
rowHeights = Array(repeating: nil, count: myParentObject.children.count)
...
}
我的问题是:
- 显式声明这些属性是否占用任何资源,如果占用,占用多少资源?
- 我使用的 syntax/approach 初始化是否正确(尤其是数组)?
是的,但只是非常小的数量——不值得考虑。
我不知道你所说的 "initialization" 或 "correct" 是什么意思。两者都被隐式初始化为 nil
只是通过声明为 var
可选。 (在 Swift、 只有 var
选项得到隐式初始化的这种特殊处理。)你说 "and I can only initialize them later" 但实际上你稍后做的是 不初始化;您只是将 nil
值替换为不同的值。
至于"correct",能编译就一定是"correct"。但是,更广泛地说,我想我明白了 为什么 您要延迟分配这些值直到 viewDidLoad
,并且 完全 正确:使用可选以便您稍后可以在 viewDidLoad
中提供值是 Swift iOS 编程中常见且正确(且重要)的模式。
所以我正在使用两个属性,一个是数组,一个是 Realm 的自定义容器类型 Results
(其行为类似于 List<T>
):
var rowHeights: [CGFloat?]!
var myResults: Results<ChildObject>!
在这两种情况下,我都需要全局声明它们,我只能在viewWillAppear()
后面初始化它们,这意味着从技术上讲,就Swift而言,初始化是'保证:
override func viewWillAppear(_ animated: Bool) {
...
myResults = myParentObject.children.sorted(byKeyPath: "childPath", ascending: true)
...
rowHeights = Array(repeating: nil, count: myParentObject.children.count)
...
}
我的问题是:
- 显式声明这些属性是否占用任何资源,如果占用,占用多少资源?
- 我使用的 syntax/approach 初始化是否正确(尤其是数组)?
是的,但只是非常小的数量——不值得考虑。
我不知道你所说的 "initialization" 或 "correct" 是什么意思。两者都被隐式初始化为
nil
只是通过声明为var
可选。 (在 Swift、 只有var
选项得到隐式初始化的这种特殊处理。)你说 "and I can only initialize them later" 但实际上你稍后做的是 不初始化;您只是将nil
值替换为不同的值。至于"correct",能编译就一定是"correct"。但是,更广泛地说,我想我明白了 为什么 您要延迟分配这些值直到
viewDidLoad
,并且 完全 正确:使用可选以便您稍后可以在viewDidLoad
中提供值是 Swift iOS 编程中常见且正确(且重要)的模式。