[解決済み】Swiftの配列の代入が矛盾している(参照でも深層コピーでもない)理由はあるのか?)
質問
ドキュメントを読んでいて、この言語の設計上の決定事項のいくつかに、いつも首をかしげています。 しかし、私が本当に困惑したのは、配列がどのように扱われるかです。
慌てて遊び場に行って、これらを試してみました。 あなたも試してみてください。 では、最初の例です。
var a = [1, 2, 3]
var b = a
a[1] = 42
a
b
ここで
a
と
b
はいずれも
[1, 42, 3]
を受け入れることができます。 配列が参照される - OK!
では、この例をご覧ください。
var c = [1, 2, 3]
var d = c
c.append(42)
c
d
c
は
[1, 2, 3, 42]
BUT
d
は
[1, 2, 3]
. ということです。
d
は、前回の例ではその変更を確認しましたが、今回の例では確認できません。 ドキュメントによると、それは長さが変わったからだそうです。
さて、こちらはどうでしょう。
var e = [1, 2, 3]
var f = e
e[0..2] = [4, 5]
e
f
e
は
[4, 5, 3]
は、かっこいいですね。 複数インデックスの置き換えができるのはいいことですが
f
長さが変わっていないにもかかわらず、STILLは変化を見ません。
つまり、まとめると、配列の共通参照は、1つの要素を変更すれば変化を見るが、複数の要素を変更したり、項目を追加したりすると、コピーが作成されるのです。
これはとてもお粗末な設計のように思えます。 私がそう考えるのは正しいのでしょうか? 配列がこのように動作しなければならない理由が私にはわからないのですが、何か理由があるのでしょうか?
EDIT : 配列が変更され、値のセマンティクスを持つようになりました。 よりまともになりました。
解決するには?
注意点 配列のセマンティクスとシンタックスは、Xcodeベータ3バージョンで変更されました。 ( ブログ記事 )であるため、この質問はもはや適用されません。以下の回答は、ベータ2に適用されました。
それは、パフォーマンスのためです。基本的に、彼らはできる限り配列のコピーを避けようとしています(そして、"Cのようなパフォーマンス"を主張しています)。その言語を引用すると 書籍 :
配列の場合は、配列の長さを変更する可能性のある操作を行ったときのみコピーが行われます。これには、項目の追加、挿入、削除、または範囲指定添え字を使用して配列の項目範囲を置き換えることが含まれます。
少し分かりにくいというのは同意しますが、少なくとも、どのように機能するかについて、明確でシンプルな説明があります。
そのセクションには、アレイを一意に参照する方法、アレイを強制コピーする方法、2つのアレイがストレージを共有しているかどうかを確認する方法などの情報も含まれています。
関連
-
[解決済み] PHPの配列を別の配列にコピーする関数はありますか?
-
[解決済み] Reactでオブジェクトの配列をマップする方法
-
[解決済み] デリミタを使って文字列をスライスする方法
-
[解決済み] Swift Betaのパフォーマンス:配列のソート
-
[解決済み】iPhone/iPad/iOS用の高速で無駄のないPDFビューア - ヒントとヒント?
-
[解決済み】Swiftで配列から要素を削除する方法
-
[解決済み】Bashでスペースで区切られた文字列を配列に読み込む
-
[解決済み】240以上の要素を持つ配列に対してループ処理を行うと、パフォーマンスに大きな影響があるのはなぜですか?
-
[解決済み】ファイルからBashの配列に行を読み込む【重複】。
-
[解決済み] Swift。配列を参照で渡す?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 代入A(:)=Bにおいて、AとBの要素数は同じでなければならない
-
[解決済み] C言語で**は何をするのですか?[重複しています]
-
[解決済み】JSONのオブジェクトの配列をYAMLで表現したもの
-
[解決済み】Bashで配列の要素を別行動で表示する?
-
[解決済み】KotlinのList型とArray型の違いについて
-
[解決済み】Rubyで区切り文字列を分割し、配列に変換する方法は?
-
[解決済み】要素を配列の先頭にプッシュする最も簡単な方法は何ですか?
-
[解決済み】配列とリンクリストの比較
-
[解決済み】bashでパラメータとして配列を渡す。
-
[解決済み】ファイルからBashの配列に行を読み込む【重複】。