2017-06-19 94 views
0

你好,我有一个使用willset功能的可选变量。由于它的一个可选的常规设置将不起作用。在意志集里面我设置变量至少初始化它,如果新值是零。不幸的是,之后的价值还没有任何想法?谢谢Willset初始化后不保留价值

代码:

var arrayOfString: [String]? { 
    willSet { 
     self.arrayOfString = newValue == nil ? [String]() : newValue 
    } 
} 
+2

为什么要选择开始?为什么不只是'var arrayOfString = [String]()'? – Hamish

+0

@Hamish感谢您的回复,我想它是可选的,因为最初的arrayOfString = someValue将来自应用程序的不同部分,因此,我想如果我先初始化,然后如果应用程序确实得到一个数组的字符串并将其添加到此处,当我不需要时,我会使用2个内存空间? – paul590

回答

1

自可选的常规设置将无法正常工作

不正确。由于它是不是计算属性set将不起作用。

您需要重新阅读有关willSetdidSet的部分。 willSet在之前被称为任何值都写入变量。即无论您写入willSet中的变量,您的代码将立即被调用代码的赋值覆盖。

如果您指定nil您将覆盖您的字符串数组nil

通过简化只是在做

var arrayOfString: [String] = [] 
+0

谢谢你的回应,我想它是可选的,因为初始arrayOfString = someValue将来自应用程序的不同部分,因此,我想如果我先初始化,然后如果应用程序确实得到一个字符串数组并在这里添加它,当我不需要时,我会使用2个内存空间? – paul590

+2

@ paul590这就是所谓的过早优化。不要担心分配空数组所需的内存。 – Sulthan

+0

@Sulthan真棒会谢谢你的帮助! – paul590

1

您需要使用didSet

var arrayOfString: [String]? { 
    didSet { 
     self.arrayOfString = arrayOfString ?? [] 
    } 
} 

否则,值由原始值立即覆盖。

但是请注意,如果该变量不应该包含一个可选的,它应该被宣布为:

var arrayOfString: [String] 

,并在需要时分配应该添加?? []

否则,每次访问该值时都必须处理展开。

+0

感谢您的回应我认为这是这种情况,但我想100%肯定 – paul590