22407

[code]

    class Test : NSObject {
       var testUint8: UInt8 = 0x00
       var testNSNumber: NSNumber = NSNumber(unsignedChar: 0x00)
    }
    
    var test1 = Test()
    var test2 = Test()　// 値を変えておく
    test1=test2
    
[/code]

上記で値は更新されるのですが、  
test1の領域（アドレス）にtest2の中身が「=」でコピーされるということでしょうか。  
以下と同意なのでしょうか。

[code]

    test1.testUint8 = test2.testUint8
    test1.testNSNumber= test2.testNSNumber
    
[/code]


CC BY-SA 3.0
2016-02-22T16:14:39.647
22403
2016-03-24T13:57:45.603
12842
question
swift
memcopy()やmemclear()のようなものは無いのでしょうか。


> test1の領域（アドレス）にtest2の中身が「=」でコピーされるということでしょうか。

コピーされるのは、「中身」ではなくて、 **アドレス** です。なので、`test1`をあらかじめイニシアライズする必要はないです。

[code]

    var test2 = Test()
    var test1 = test2
    
[/code]

アドレスのコピーなので、`test2`のプロパティの値に変更を加えると、`test1`のプロパティの値も変わります。同一のインスタンスを参照しているのですから、そうなります。

[code]

    test2.testUint8 = 20
    print(test1.testUint8) // 20
    
[/code]

* * *

「memcopy()」が、「クラスのインスタンスを、バイト列としてコピーする」ことを意味する、クラスのインスタンスをバイト列としてコピーする方法を知りたいというのが、質問者さんの意図だとして、次の話をします。  
あるいは、クラスのインスタンスを、参照のコピーでなく、実体のコピーをしたいという意図かもしれないので、それについても触れます。

バイト列を扱うには、Foundationフレームワークの`NSData`クラスを使います。純粋にSwiftだけ、とはいきません。インスタンスをバイト列に変換（エンコード）するには、クラスが`NSCodiong`プロトコルに準拠しているのが条件となります。

[code]

    import Foundation
    
    class TestClass: NSObject, NSCoding { // NSCodingを準拠。
        var value1: UInt8 = 0
        var value2: NSNumber = NSNumber(unsignedChar: 0)
    
        override init() {
            super.init()
        }
    
        // NSCodingに準拠すると必須になるイニシアライザ。アーカイブからデコードする処理を記述。
        required init?(coder aDecoder: NSCoder) {
            self.value1 = UInt8(aDecoder.decodeIntForKey("value1"))
            self.value2 = aDecoder.decodeObjectForKey("value2") as! NSNumber
        }
    
        // エンコードする処理を記述。
        func encodeWithCoder(aCoder: NSCoder) {
            aCoder.encodeInt(Int32(value1), forKey: "value1")
            aCoder.encodeObject(value2, forKey: "value2")
        }
    
        // NSObjectのメソッド、copy()を有効にするための実装。
        func copyWithZone(zone: NSZone) -> AnyObject {
            let object = TestClass()
            object.value1 = self.value1
            object.value2 = self.value2
            return object
        }
    }
    
    // 元インスタンスを作成。
    let sample = TestClass()
    sample.value1 = 100
    sample.value2 = NSNumber(unsignedChar: 50)
    
    // copy()メソッドによるコピー。
    let sample1 = sample.copy()
    print(sample1.value1) // 100
    print(sample1.value2) // 50
    
    // NSDataへの変換と、TestClassへ戻す変換（かつコピー）。
    let theData = NSKeyedArchiver.archivedDataWithRootObject(sample)
    let sample2 = NSKeyedUnarchiver.unarchiveObjectWithData(theData) as! TestClass
    print(sample2.value1) // 100
    print(sample2.value2) // 50
    
[/code]

いずれの形のコピーにしても、参照型のプロパティは、参照をコピーしても意味がなく、参照先の値のコピーをしなければいけないために、それ相応の処理を書かなければいけません。`memcpy()`1行だけで済むというわけにはいきません。


CC BY-SA 3.0
2016-02-22T18:37:39.863
22407
2016-02-23T12:35:41.863
2016-02-23T12:35:41.863
7362
7362
22403
answer