こんにちは。きんくまです。
この前、SwiftのEnumとStructureのページを読んでました。
>> Enumerations
>> Classes and Structures
いろんな書き方があって、フムフムと思ったのですが、Structureのページで気になったところ。
Structures and Enumerations Are Value Types
Classes Are Reference Types
Assignment and Copy Behavior for Strings, Arrays, and Dictionaries
ということで、StructureやEnumは値タイプで、Classは参照タイプとのこと。
NSArrayなどのObjective-CのFoundationのタイプは参照タイプだけど、SwiftネイティブのArrayは値タイプだっていうところ。
というわけで、コードで実際に試してみました。
Playground環境でやってみた。
import UIKit var nsArr:NSMutableArray = NSMutableArray() var altNsArr:NSMutableArray nsArr.addObject("hello") nsArr.addObject("world") altNsArr = nsArr println("before change ===") for val in nsArr{ println("nsArr => \(val)") } for val in altNsArr{ println("altNsArr => \(val)") } nsArr.replaceObjectAtIndex(1, withObject: "swift") println("after change ===") for val in nsArr{ println("nsArr => \(val)") } for val in altNsArr{ println("altNsArr => \(val)") } //================== var arr:[String] = ["hello", "world"] var copiedArr:[String] = arr println("before change ===") for val in arr{ println("arr => \(val)") } for val in copiedArr{ println("copiedArr => \(val)") } arr[1] = "swift" println("after change ===") for val in arr{ println("arr => \(val)") } for val in copiedArr{ println("copiedArr => \(val)") }
何をやっているかっていうと、
各配列(NSMutableArray、swfitネイティブのArray)を宣言。
もうひとつ別の配列も宣言。
別の配列に = でもとの配列に代入
もとの配列をいじってみて、出力結果がどうなるのか?
という実験です。
出力結果はこんな感じになりました。
before change === nsArr => hello nsArr => world altNsArr => hello altNsArr => world after change === nsArr => hello nsArr => swift altNsArr => hello altNsArr => swift before change === arr => hello arr => world copiedArr => hello copiedArr => world after change === arr => hello arr => swift copiedArr => hello copiedArr => world <- ここがポイント!!!
どこが違うかっていうと、以下のようになりました。
NSMutableArrayの場合
もとの配列を変更すると代入された別の配列の中身も切り替わる
swiftネイティブのArrayの場合
別の配列の中身は変更される前のまま
というわけでここでのポイントは
NSArrayなんかの場合は参照を渡しているから、同じ実体をさしているのにたいして、swiftネイティブの場合は、代入した時点でそのコピーを渡しているから、コピー元と、コピー先が独立しているっていうところでした。
■ 自作iPhoneアプリ 好評発売中!
・フォルメモ - シンプルなフォルダつきメモ帳
・ジッピー電卓 - 消費税や割引もサクサク計算!
■ LINEスタンプ作りました!
毎日使える。とぼけたウサギ