[iOS] SwiftでのNSArrayとArrayの違い

2014/07/24

こんにちは。きんくまです。

この前、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ネイティブの場合は、代入した時点でそのコピーを渡しているから、コピー元と、コピー先が独立しているっていうところでした。

LINEで送る
Pocket

自作iPhoneアプリ 好評発売中!
フォルメモ - シンプルなフォルダつきメモ帳
ジッピー電卓 - 消費税や割引もサクサク計算!

ページトップへ戻る