你好,我有一个使用willset功能的可选变量。由于它的一个可选的常规设置将不起作用。在意志集里面我设置变量至少初始化它,如果新值是零。不幸的是,之后的价值还没有任何想法?谢谢Willset初始化后不保留价值
代码:
var arrayOfString: [String]? {
willSet {
self.arrayOfString = newValue == nil ? [String]() : newValue
}
}
你好,我有一个使用willset功能的可选变量。由于它的一个可选的常规设置将不起作用。在意志集里面我设置变量至少初始化它,如果新值是零。不幸的是,之后的价值还没有任何想法?谢谢Willset初始化后不保留价值
代码:
var arrayOfString: [String]? {
willSet {
self.arrayOfString = newValue == nil ? [String]() : newValue
}
}
自可选的常规设置将无法正常工作
不正确。由于它是不是计算属性set
将不起作用。
您需要重新阅读有关willSet
和didSet
的部分。 willSet
在之前被称为任何值都写入变量。即无论您写入willSet
中的变量,您的代码将立即被调用代码的赋值覆盖。
如果您指定nil
您将覆盖您的字符串数组nil
。
通过简化只是在做
var arrayOfString: [String] = []
您需要使用didSet
:
var arrayOfString: [String]? {
didSet {
self.arrayOfString = arrayOfString ?? []
}
}
否则,值由原始值立即覆盖。
但是请注意,如果该变量不应该包含一个可选的,它应该被宣布为:
var arrayOfString: [String]
,并在需要时分配应该添加?? []
。
否则,每次访问该值时都必须处理展开。
感谢您的回应我认为这是这种情况,但我想100%肯定 – paul590
为什么要选择开始?为什么不只是'var arrayOfString = [String]()'? – Hamish
@Hamish感谢您的回复,我想它是可选的,因为最初的arrayOfString = someValue将来自应用程序的不同部分,因此,我想如果我先初始化,然后如果应用程序确实得到一个数组的字符串并将其添加到此处,当我不需要时,我会使用2个内存空间? – paul590