2016-05-20 3 views
0

アイテムが追加された後、どのように参照を配列に保持するのですか?操作後の配列への参照を保持する方法は?

コード例が更新されています。これは、先の例が十分にはっきりしていないためです。

class ViewController: UIViewController { 

    var numbers = Numbers.singleton.numbers 

    override func viewDidLoad() { 

     print(numbers.count) 

     Numbers.singleton.add(1) 

     print(numbers.count) // prints 0 
     print(Numbers.singleton.numbers.count) // prints 1 
    } 
} 

class Numbers { 

    static let singleton = Numbers() 

    var numbers: [Int]! 

    private init() { 
     numbers = [] 
    } 

    func add(number: Int) { 
     numbers.append(number) 
    } 
} 
+1

私はあなたが出力を切り替えたと思います - 最初の印刷物は1、もう1つは0です。 – luk2302

+0

@ luk2302うわー、私はしました! – Manuel

+0

何が問題なのですか?あなたは 'self.array'を変更して動作しました。あなたの 'arrayRef'は無意味なコピーです。ストーリーから削除するだけです。 – matt

答えて

2

Swiftの配列には「参照」がありません。それらは構造体であり、構造体はvalue typeです。 arrayRef(別名は悪い)コピーです。self.arrayへの参照ではありません。

さらに、あなたがしたいと思っていることをしたいと望む理由はありません。変更可能な配列への2つの同時参照を持つことは、配列が背中の背後で変更される可能性があるため、安全ではありません。スウィフトデザインは賢明です。それを破壊しないでください。

+0

NSArrayを代わりに使用すると、それはクラスなので参照できますか?確かに – Manuel

+1

。 NSArrayは不変なので、NSArrayを介して配列を追加することはできません(追加することはできません)。ココアは、スウィフトと同じ種類の安全性を提供しています。 – matt

+0

実際のコードに近いコード例に更新しました。 'numbers'配列は、実際にはアプリケーションの他のプロセスによって変更することができます。配列への参照は、クラス全体で利用可能な 'var numbers = Numbers.singleton.numbers'を持つプロパティとして定義されています。しかし、それは実際に私が理解するように配列をコピーしています。だから、これは良いデザインになるでしょう - クラス全体で 'Numbers.singleton.numbers'だけでアクセスできますか? – Manuel

関連する問題