Swift 展开会为值类型创建障碍
查看以下代码(操场就绪) 我无法从Swift 展开会为值类型创建障碍,swift,optional,unwrap,Swift,Optional,Unwrap,查看以下代码(操场就绪) 我无法从if let语句中将数据附加到未包装的可选数组中 允许附加可选数组的最佳方法是什么 class ValueTypeTest { var data: [Int]? func tryAppend() { if var unwrappedData = self.data { unwrappedData += [2, 3] // problem ! self.data! += [4, 5]
if let
语句中将数据附加到未包装的可选数组中
允许附加可选数组的最佳方法是什么
class ValueTypeTest {
var data: [Int]?
func tryAppend() {
if var unwrappedData = self.data {
unwrappedData += [2, 3] // problem !
self.data! += [4, 5] // works
} else {
// Initialize paging and initial results
self.data = [0, 1]
}
}
}
var v = ValueTypeTest()
v.data // nil
v.tryAppend()
v.data // [0, 1]
v.tryAppend()
v.data // expected: [0, 1, 2, 3, 4, 5] actual: [0, 1, 4, 5]
因为数组是值类型,在执行
if var
操作时将被复制。因此,您不会更改self.data,而是unwrappedata
试试这个:
self.data = (self.data ?? [0, 1]) + [2, 3, 4, 5]
这就是我的意思
func tryAppend() {
if let unwrappedData = self.data {
self.data = unwrappedData + [2, 3, 4, 5]
} else {
// Initialize paging and initial results
self.data = [0, 1]
}
}
函数中声明的
var unwrappedData
是该函数的局部变量
该行的结果窗格显示的输出包含:
[0,1,2,3]
forunwrappedData
谢谢,但分配给self.data并不是展开的目的。我同意这是一种更好的语法,我只是想知道这是否是推荐的解决方案。@MaximVeksler好吧,至少你可以做self.data=unwrappedData+[2,3]
。这可能更适合你的目的?如果你仔细想想,这几乎就是你在打开一个值类型时所能做的。请更新您的答案?“我会看看这是否合理,并接受它。”MaximVeksler更新。看起来你的设计是错误的。总是成功的tryAppend()
操作似乎与数组是可选的想法相矛盾。我相信您的示例是一个简化的示例,可能没有展示实际代码的一些细节,但在示例中,您提供的空非可选数组显然比可选数组更合适。