Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.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
Arrays 如何在Swift中将可选数组连接到另一个数组?_Arrays_Swift - Fatal编程技术网

Arrays 如何在Swift中将可选数组连接到另一个数组?

Arrays 如何在Swift中将可选数组连接到另一个数组?,arrays,swift,Arrays,Swift,我知道这听起来很可笑,但我现在很困惑。 基本上我有两个变量,一个是[Data],另一个是数组? 我需要把这两者结合起来。 我试过做var1+var2,这给了我一些错误,比如不能对这两个进行二进制操作。 所以我在谷歌上搜索,我可以使用append方法,现在有更多的问题: append方法在autofill中被划掉了,所以我不确定是否应该使用它 即使我尝试使用它(当它被划掉时),它仍然会给我错误 以下是我得到的代码和错误: var a1:[Data] //a return value from ot

我知道这听起来很可笑,但我现在很困惑。 基本上我有两个变量,一个是
[Data]
,另一个是
数组?

我需要把这两者结合起来。 我试过做
var1+var2
,这给了我一些错误,比如不能对这两个进行二进制操作。 所以我在谷歌上搜索,我可以使用append方法,现在有更多的问题:

  • append方法在autofill中被划掉了,所以我不确定是否应该使用它
  • 即使我尝试使用它(当它被划掉时),它仍然会给我错误
  • 以下是我得到的代码和错误:

    var a1:[Data] //a return value from other function
    var a2:Array<Data>? //a parameter that's passed in
    
    a1.append(contentsOf:a2) //Cannot use mutating member on immutable value: function call returns immutable value
    a1+a2 //Binary operator '+' cannot be applied to operands of type 'Array<Data>' and 'Array<Data>?'
    
    var a1:[Data]//来自其他函数的返回值
    变量a2:数组//传入的参数
    a1.append(contentsOf:a2)//不能对不可变值使用mutating成员:函数调用返回不可变值
    a1+a2//二进制运算符“+”不能应用于“Array”和“Array”类型的操作数
    

    两个数组都可以为空,如何连接这两个数组?

    其中一个数组是可选的。您必须以某种方式处理可能的
    nil

    使用零聚结的简单解决方案:

    let concatenated = var1 + (var2 ?? [])
    
    或者,稍微复杂一点:

    var concatenated = var1
    
    if let var2 = var2 {
       concatenated.append(var2)
    }
    

    当然,还有其他可能的解决方案。

    其中一个阵列是可选的。您必须以某种方式处理可能的
    nil

    使用零聚结的简单解决方案:

    let concatenated = var1 + (var2 ?? [])
    
    或者,稍微复杂一点:

    var concatenated = var1
    
    if let var2 = var2 {
       concatenated.append(var2)
    }
    

    当然,还有其他可能的解决方案。

    Sulthan的答案是快速解决方案,但如果您在代码中经常这样做,您可以重载
    +
    来自动处理它:

    extension Array {
        static func + (lhs: [Element], rhs: [Element]?) -> [Element] {
            return lhs + (rhs ?? [])
        }
    }
    

    Sulthan的答案是快速解决方案,但如果您在代码中经常这样做,您可以重载
    +
    来自动处理它:

    extension Array {
        static func + (lhs: [Element], rhs: [Element]?) -> [Element] {
            return lhs + (rhs ?? [])
        }
    }
    

    您还可以扩展RangeReplacetable集合并实现自定义追加方法以及添加和变异添加运算符,如下所示:

    extension RangeReplaceableCollection {
        public mutating func append<S: Sequence>(contentsOf sequence: S?) where Element == S.Element {
            guard let sequence = sequence else { return }
            reserveCapacity(count + sequence.underestimatedCount)
            append(contentsOf: sequence)
        }
    }
    

    您还可以扩展RangeReplacetable集合并实现自定义追加方法以及添加和变异添加运算符,如下所示:

    extension RangeReplaceableCollection {
        public mutating func append<S: Sequence>(contentsOf sequence: S?) where Element == S.Element {
            guard let sequence = sequence else { return }
            reserveCapacity(count + sequence.underestimatedCount)
            append(contentsOf: sequence)
        }
    }
    

    如果其中一个是可选的,您可以通过
    [Data]
    的方式,例如
    var1+(var2??[])
    ,而
    数组
    实际上是一样的。
    起作用。@Sulthan谢谢你,就这样,解决了@Sulthan你应该把你的评论作为回答。可选择的思考是答案。不要将答案编辑到问题中。要么等待@Sulthan发布他的评论作为答案,要么自己回答。如果其中一个选项是可选的,您可以顺便问一下
    [Data]
    数组
    实际上是一样的。
    起作用。@Sulthan谢谢你,就这样,解决了@Sulthan你应该把你的评论作为回答。可选择的思考是答案。不要将答案编辑到问题中。要么等待@Sulthan将其评论作为答案发布,要么自己回答。如果可选值位于操作数的左侧,如何?加法应该是交换的。但是,向
    nil
    数组中添加一些内容是否有意义?如果可选项位于操作数的左侧如何?加法应该是交换的。但是,向
    nil
    数组中添加一些内容有意义吗?