Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 展开会为值类型创建障碍_Swift_Optional_Unwrap - Fatal编程技术网

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]
for
unwrappedData

谢谢,但分配给self.data并不是展开的目的。我同意这是一种更好的语法,我只是想知道这是否是推荐的解决方案。@MaximVeksler好吧,至少你可以做
self.data=unwrappedData+[2,3]
。这可能更适合你的目的?如果你仔细想想,这几乎就是你在打开一个值类型时所能做的。请更新您的答案?“我会看看这是否合理,并接受它。”MaximVeksler更新。看起来你的设计是错误的。总是成功的
tryAppend()
操作似乎与数组是可选的想法相矛盾。我相信您的示例是一个简化的示例,可能没有展示实际代码的一些细节,但在示例中,您提供的空非可选数组显然比可选数组更合适。