2016-05-19 4 views
-3

Swiftを使用してオブジェクトのコピーを返す必要がありますが、これを行う方法を理解できません。Swift:オブジェクトのコピーを返す

私はObjective-Cでそれをやる方法この:

-(NSArray*) doingSomethingwith 
{ 
    NSArray *myArray = @[@"a",@"b",@"c",@"d",]; 

    return [myArray copy]; 
} 

あなたのいずれかが、このスウィフトを行う方法を知っていますか?

本当にありがとうございます。

+0

NSArrayコピーを返す方法、またはオブジェクトコピーを返す方法を知りたいですか? – pableiros

答えて

3

配列の内容が値オブジェクトの場合、定数文字列は例のとおりです。迅速な割り当てにはコピー動作があります。これは、Classes And Structuresアップルのドキュメントの最後に説明されて:文字列、配列のための

割り当ておよびコピーの動作、および辞書

スウィフトで

は、文字列、配列、および辞書など、多くの基本データ型が実装されています構造として。つまり、文字列、配列、辞書などのデータは、新しい定数または変数に代入されるとき、または関数またはメソッドに渡されたときにコピーされます。

この動作はFoundationと異なります。NSString、NSArray、およびNSDictionaryは構造体ではなくクラスとして実装されています。 Foundationの文字列、配列、および辞書は、常にコピーとしてではなく、既存のインスタンスへの参照として割り当てられ、渡されます。

注:上記の説明は、文字列、配列、および辞書の「コピー」を参照しています。コードに表示される動作は、コピーが行われたかのように常になります。しかし、Swiftは絶対に必要なときにシーンの裏で実際のコピーを実行します。 Swiftは、すべての価値のコピーを管理して最適なパフォーマンスを確保しています。この最適化を先取りしようとすると、割り当てを避けるべきではありません。

あなたの配列に参照オブジェクトが含まれていて、それらのディープコピーを返す場合、それはややこしいです。それをどう扱うかについてはhere's a discussionです。 の処理方法は、値の型を使用するコードをやり直すことです。

-1

スウィフトは参考になりません。したがって、配列を直接返すことができます。

+1

これは当てはまりません。 Swift配列の参照型がある場合は、配列を直接返すことでディープコピーが作成されません。どちらのコピーも同じオブジェクトを参照し、一方を変更すると他方を変更します。 @WillM。 –

+0

。やや真実。しかし、迅速な配列とnsmutablearrayを持って、他のコントローラ(例えばsegueを実行する)に渡して編集しようとすると、以前のコントローラではswift配列は変更されませんが、以前のコントローラではnsmutablearrayで変更されます。ここで答えを確認してください。 http://stackoverflow.com/questions/36208709/creating-a-mutable-dictionary-in-swift –

+0

そして、彼が参照している例では、配列を直接返すと問題はありません。毎回新しい配列が作成されます。 –

1

このようなことができます。

+0

これは変更可能でないため、「動作します」のみです。真のコピーではなく、すべてのコピーが同じオブジェクトを指しています。あなたは、myArray [0]のメモリアドレスとあなたのコピーの最初の要素を表示することでわかります。 –

関連する問題