2016-04-13 17 views
2

私はクロージャについて学び始めています。私が作業しているプロジェクトでそれらを実装したいと思っています。私はいくつかの助けをしたいと思います。フラットなネストされたオブジェクトへのクロージャー?

私は次のように定義されたクラスがあります。

class MyObject { 
var name: String? 
var type: String? 
var subObjects: [MyObject]? 
} 

を私は[MyObject]を平らにするために、クロージャ以上オーデル機能(flatMapのようなものが頭に浮かぶ)を使用すると、1列にすべてのMyObjectsubOjectsに参加。

私は[MyObject].flatMap()を使用しようとしましたが、この操作ではネストされたサブオブジェクトは返されません。

答えて

2

再帰的クラス構造を平坦化する1つの方法は、再帰関数を使用する方法です。

は、ここでは、希望のクラスが平坦化されている:

func test() { 
    let h = [ 
     Nested(1, [Nested(2, nil), Nested(3, nil)]) 
    , Nested(4, nil) 
    , Nested(5, [Nested(6, nil), Nested(7, [Nested(8, nil), Nested(9, nil)])]) 
    ] 
    func recursiveFlat(next:Nested) -> [Nested] { 
     var res = [Nested]() 
     res.append(next) 
     if let subArray = next.sub { 
      res.appendContentsOf(subArray.flatMap({ (item) -> [Nested] in 
       recursiveFlat(item) 
      })) 
     } 
     return res 
    } 
    for item in h.flatMap(recursiveFlat) { 
     print(item.n) 
    } 
} 

このアプローチの心はrecursiveFlatローカル関数である:ここでは

public class Nested { 
    public let n : Int 
    public let sub : [Nested]? 
    public init(_ n:Int, _ sub:[Nested]?) { 
     self.n = n 
     self.sub = sub 
    } 
} 

は、これが行うことができる方法を示し関数です。ネストされたオブジェクトのコンテンツを結果に追加し、各要素の条件付きで自身のコンテンツを追加するために条件付きで自身を呼び出します。

+0

申し訳ありませんが、私はちょうどこれをテストし、動作します!受け入れられた答え。 – Ces

3

まず、タイプsubObjectsを非オプションにすることを強くお勧めします。オプションの配列の理由はめったにありません。 本当には "配列なし"と "空の配列"を区別する必要がありますか?これは非常に珍しいことです。ただ配列になるあなたはsubObjectsを作る場合、あなたは単純な再帰関数として記述しているものを書くことができます。

func flattenMyObjects(myObjects: [MyObject]) -> [MyObject] { 
    return myObjects.flatMap { (myObject) -> [MyObject] in 
     var result = [myObject] 
     result.appendContentsOf(flattenMyObjects(myObject.subObjects)) 
     return result 
    } 
} 

は、あなたがそれをオプションにする必要がある場合、変更はあなたが追加する必要があります(軽微なものですif-letまたは類似のもの)。

+2

これは間違いなく問題ですが、これを 'return objects.flatMap {[$ 0] + flattenObjects($ 0.subObjects)}'に省略することができます。 –

+0

答えがありがとう、私はJSONのシリアル化の解析の結果、これは私が@ dasblinkenlightの答えを受け入れた理由で、オプションであるために私のsubArrayが必要です。 – Ces

関連する問題