18800


お世話になります。

SwiftのArrayは値渡し、NSMutableArrayは参照渡しと聞きました。

SwiftのArrayでも、NSMutableArrayのように参照渡しで使用することはできないのでしょうか？

値渡しですと、Arrayの要素を変更した後に、再度Arrayに代入しなおすいうことが必要になると思います。  
その点では、NSMutableArrayの方が使いやすいと思うのですが。  
SwiftのArrayでも同様のことができますか？

ご教示お願いいたします。


CC BY-SA 3.0
2015-11-13T19:08:11.610
18796
2015-11-14T01:08:53.343
12297
question
swift
SwiftのArrayをNSArrayと同様に参照渡しで使えますか？


`inout`パラメータを使うと、例えば下記のような関数を定義して、

[code]

    func add(inout stringArray: [String]) {
        stringArray.append("FooBar")
    }
    
[/code]

参照渡しのように利用できます。

[code]

    var array = ["Foo", "Bar", "Baz"]
    
    add(&array)
    print(array) // => ["Foo", "Bar", "Baz", "FooBar"]
    
[/code]

ただ、Arrayが値型で不変であることでプログラムがシンプルになるなどメリットがあるので、わざわざArrayを共有するような使い方はあまりしません。  
（もちろんケースバイケースで状態を共有する方が良い場合もあります。が、基本的にSwiftは標準ライブラリもほとんど値型が使われていて、値型の性質をうまく利用する方がSwiftらしいコードが書けます。）


CC BY-SA 3.0
2015-11-13T23:51:35.330
18798
2015-11-14T00:22:12.000
2015-11-14T00:22:12.000
5519
5519
18796
answer


Swiftには値型と参照型があります。参照型を使ってデータを管理すれば、ArrayをNSMutableArrayと同じように使えます。

Xcode 7.1.1のPlaygroundで確認。

[code]

    import Foundation
    
    /// 参照型でデータを管理
    class RefType : CustomStringConvertible {
        var no = 0
        var name = "name"
    
        init(no: Int, name: String) {
            self.no = no
            self.name = name
        }
    
        var description: String {
            return "no:\(no) name: \(name)"
        }
    }
    
    func testRefType() {
    
        // 参照型の配列を作成
        var ar = [RefType]()
    
        let t0 = RefType(no: 1, name: "one")
        ar.append(t0)
    
        let t1 = RefType(no: 2, name: "two")
        ar.append(t1)
    
        print("ref array: [\(ar[0]), \(ar[1])]")
    
        // 参照型なので、データの変更で参照先の値が変わる
        let t3 = ar[0]
        t3.no = 3
        t3.name = "three"
    
        print("ref array: [\(ar[0]), \(ar[1])]")
    }
    
    testRefType()
    
[/code]

実行結果。

[code]

    ref array: [no:1 name: one, no:2 name: two]
    ref array: [no:3 name: three, no:2 name: two]
    
[/code]

値型と参照型について、詳細はこの辺りを参考にしてください。

The Swift Programming Language (Swift 2.1): Classes and Structures  
<https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ClassesAndStructures.html>

Value and Reference Types - Swift Blog - Apple Developer  
<https://developer.apple.com/swift/blog/?id=10>


CC BY-SA 3.0
2015-11-14T00:14:36.953
18800
2015-11-14T01:08:53.343
2015-11-14T01:08:53.343
7459
7459
18796
answer