2017-02-01 9 views
0

私は配列にappend(_:)メソッドがあることを知っていますが、これは元の配列を変更します。配列の最後にスウィフトを追加

なぜ配列もその要素を追加した新しい配列を返すappending(_:)を実装していますか?私はこれを数回実装しましたが、まだ存在しない理由があるのだろうかと疑問に思っていますか?

(私の唯一の推測では、これが効率的に行うことであるということでしょう? - あなたはあなたの配列を複数回コピーすることになるループ内でこのメソッドを使用している場合)あなたはアレイの拡張はこれに間に合わせることができます

+1

なぜ 'let newArray = oldArray + [element]'と書くことができるのでしょうか? –

+0

私は、 'let newArray = oldArray + element'が一時的な配列を要素を含むようにする方が効率的であると(おそらくは間違っている)と思いましたか? – deanWombourne

答えて

0

extension Array{ 
    func appending(_ element:Element) -> Array<Element>{ 
     var result = self 
     result.append(element) 
     return result 
    } 
} 
+0

私はそれができることを知っている - 私はまだそれがまだ行われていないことにもっと興味がある:) – deanWombourne

+0

(私は質問しているものについて曖昧さを取り除くために私の質問を明確にした) – deanWombourne

+0

効率の理由。私はあなたがこの拡張のループを作るメソッドのパフォーマンスを測定する単体テストを作成し、標準的な追加メソッドを使用して魔法のメソッドを持つ別のUTを作成すると違いが見えます。インストゥルメントを使用してメモリ割り当てとCPUパフォーマンスを測定します。 –

0

私たちは何を議論していますか? 'APPEND' ドキュメントから始め

/// Append `newElement` to the Array. 
/// 
/// - Complexity: Amortized O(1) unless `self`'s storage is shared with another live array; O(`count`) if `self` does not wrap a bridged 

NSArray。あなたはポインタとスマートポインタについての知識を持っている必要があり

:それ以外の場合は効率が... 公共変異のFUNCはappend(要素newElement)指定されません。

M要素

var a = [1, 2, 3] 

は単純な配列です。

あなたはN要素を追加する場合は、から始まる新しい配列を作成した場合、複雑さはO(N)

func addElements() { 
    for elment in [4, 5, 6] { 
     a.append(element) 
    } 
} 

次のようになります。

var b = a 

実行時にbを指しているので、再度実行するとaddElements複雑さは、N個の要素を追加するために元の配列プラスO(N)をコピーするために、O(M)となる。

なぜドキュメントが記載されていますか?

「そう効率が指定されていない..」

この例では、我々は、整数の単純な配列を持っていますが、カスタムオブジェクトの配列をコピーするの挙動は予測不可能であるため。

関連する問題