2016-07-10 9 views
1

Iは、辞書のクラスインスタンスのアレイは、以下に概説している:Swift 2.0 - 変数がクロージャーでコピーされましたか?

class SomeViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 

    private var array = [[String: AnyObject]]() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

    } 

    // tableview delegates 

    func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? { 
     print(“array address: \(unsafeAddressOf(array))”) // 0x000000015cf0ebd0 

     let option = UITableViewRowAction(style: .Default, title: “Option”, handler: { [weak self] (_, _) in 
      guard let strongSelf = self else { return } 

      print(“array address1: \(unsafeAddressOf(strongSelf.array))” // 0x000000015cd10c50 
     }) 

     return [option] 
    }  
} 

なぜarrayのアドレス(0x000000015cf0ebd00x000000015cd10c50対)に変更されている私はちょうどUITableViewRowAction初期にそれを捕捉よう?

おかげで、

答えて

2

これはunsafeAddressOfとスウィフトアレイの性質です。

簡単な例では、プレイグラウンドでテストすることができます。 (いいえ閉鎖、無strongSelf ...)

import Foundation 

var str = "Hello, playground" 
class MyClass { 
    var array = [[String: AnyObject]]() 

} 

let obj1 = MyClass() 

let ptr1 = unsafeAddressOf(obj1.array) 
let ptr2 = unsafeAddressOf(obj1.array) 

print(ptr1 == ptr2) 

は、Xcodeの7.3.1(スウィフト2.2.1)で数回テストしないと、すべての "偽" のプリント。

unsafeAddressOfのシグネチャは次のとおりです。

func unsafeAddressOf(object: AnyObject) -> UnsafePointer<Void> 

あなたはスウィフト配列は値型であり、あなたがAnyObjectにそれらを渡すことはできません知っているように。したがって、 "Objective-Cへのブリッジ"機能が利用可能な場合、arrayNSArrayに変換されます。この変換は「予測が難しい」方法で行われます。つまり、この変換が行われると、Swiftは新しいNSArrayインスタンスを割り当てます。

通常、スウィフトアレイやその他の値の型に適用された場合、unsafeAddressOfから何か「固い」ものは期待できません。

+0

あなたの質問に感謝、今私は '配列'が値型であることを知っている、私はそれが参照型であるべきだと思った。私の問題は次のとおりです: 'array'を更新しますが、常に更新されません。今私は実際の配列ではなく、コピーで作業していることを知っています。コンパイラーを参照として使用するように強制する方法はありますか? – quanguyen

+0

最も単純で最も安定した方法は、 '配列'を 'NSArray'として宣言しています。型情報は失われますが、 '[String:AnyObject]'の要素を含むことができ、必要に応じて '[[String:AnyObject]]'に 'as! 'でキャストできます。誰かがあなたにスウィフト・イヤー・プロポーザルをもっと見ることができますが、少し複雑かもしれません。 – OOPer

0

あなたはselfの値は新しい変数にコピーさせる、変数strongSelfに自己を割り当てているため。

変数を別の変数に割り当てるときは、メモリ割り当ての参照ではなく、別の変数にコピーされた値です。

あなたは正確にあなたの最初の時間をやっているのと同じ方法を印刷して、これを試すことができます。

print("array address: \(unsafeAddressOf(self.array))") 

あなたが閉鎖ブロック内arrayクラスのメンバにアクセスするためにselfを追加する必要があります。

関連する問題