Swift Deep Flatten Array属性

时间:2017-12-13 22:19:53

标签: arrays swift flatten

我有以下代码来创建一个Person类并且有一组人。

class Person {
    let name: String
    var children: [Person]

    init() {
        //removing init code to make question shorter, but just setting the variables passed in to the variables in the class
    }
}

var people: [Person] = [Person]()
var personA: Person = Person.init(name: "Bob Smith")
var personB: Person = Person.init(name: "Tom Smith")
var personC: Person = Person.init(name: "Billy Smith")
var personD: Person = Person.init(name: "Steve Smith")
var personE: Person = Person.init(name: "Steve Smith")

personA.children.append(personB)
personB.children.append(personD)
personB.children.append(personC)
personD.children.append(personE)

people.append(personA)

所以此时我有一个数组people,里面有一个人。这是我的代码的所有部分都完美地运作。

我有一个单独的部分,我正在尝试转换此people数组以基本上将其展平。我尝试了以下代码失败。

people.flatMap({ [$0, $0.children] }).filter({ $0 is Person }) as! [Person]

该代码根本不起作用。我尝试对其进行微调,并收到错误和警告,例如Cannot convert value of type '[Any]' to closure result type 'String?'Expression implicitly coerced from '[Person]?' to Any

第二次警告我尝试将其从[$0, $0.children]更改为[$0, $0.children ?? nil],假设可以解决问题。如果childrennil我基本上希望它继续前进而不会放任何东西,因为没有孩子。但是,做出这种改变仍然会引发同样的错误。

但基本上我想要的是从上方取people并将其从1个元素(personA)转换为5个元素(personApersonB,{{1 }},personDpersonE)。

基本上我有以下数组(包括personC属性)。

children

我想采用该数组并递归展平(深度展平)。如下所示。

- personA
    - personB
        - personD
            - personE
        - personC

我怎样才能做到这一点?

0 个答案:

没有答案