繁体   English   中英

如何在Swift中合并多个数组?

[英]How to merge multiple arrays in Swift?

我有几个类看起来像这样:

class A {}
class A1 : A {}
class A2 : A {}

class A3 : A {}
class A4 : A {}

class main {
    var a1 : A1
    var a2 : A2
    var a3s : [A3]
    var a4s : [A4]

    func getAll() -> [A] {
        return ([a1, a2] + a3s + a4s)
    }
}

如果你看看函数getAll(),你会看到我尝试返回一个所有对象的数组,类型是基类A.但是,我总是得到错误:

“二进制运算符'+( :)'不能应用于'[Any]'和'[a3s]''类型的操作数

你知道这种情况下的正确方法是什么吗?

我想这只是正确地投射数组的问题,你可以解决它:

func getAll() -> [A] {
    return ([a1, a2] as [A] + a3s as [A] + a4s)
}

只是为了好玩:如果你想动态地解决它,你可以用这种方式使用反射:

class A {}
class A1 : A {}
class A2 : A {}
class A3 : A {}
class A4 : A {}

class main {
    var a1 = A1()
    var a2 = A2()
    var a3s : [A3] = [A3()]
    var a4s : [A4] = [A4(), A4()]

    func getAll() -> [A] {
        var res = [A]()
        Mirror(reflecting:self).children.forEach {
            if let a = $0.value as? A {
                res.append(a)
            } else if let aArray = $0.value as? [A] {
                res.append(contentsOf: aArray)
            }
        }
        return res
    }
}

let all = main().getAll()
print(all) //A1, A2, A3, A4, A4

我想这可能是一种更清洁的方式。

func getAll() -> [A] {
    let all: [[A]] = [[a1], [a2], a3s, a4s]
    return all.flatMap{$0}
}

这将创建一个数组数组,然后使用flatMap将它们展平为一个数组。

问题是编译器认为你试图添加[Any][A3] 这是因为[a1, a2] is [Any]的类型[a1, a2] is [Any]a3s is [A3] 但是运营商+不能那样做。

正如其他人指出的那样,您可以将语句中的数组转换为[A]以便+运算符可以完成其工作。

由于您提到您有多个类,因此创建一个可以重用并可以正确推断类型的函数可能是个好主意。

func merge<T>(_ array: [T]...) -> [T] {
    return array.flatMap { $0 }
}

func getAll() -> [A] {
    return merge([a1, a2], a3s, a4s)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM