Morniak
Morniak

Reputation: 998

Reference member variables as class members in Swift

I want to create a class with a member working as a reference or a pointer.

Here is my code

class A {
    var arr = [Int]()

    func fill() {
        arr += 2
    }
}

class B {
    var arr = [Int]()

    func fill() {
        arr += 3
    }
}


var arr = [1]

var a = A()
a.arr = arr
a.fill()

var b = B()
b.arr = arr
b.fill()

println("\(arr) -- \(a.arr) -- \(b.arr)")

The output is [1] -- [1, 2] -- [1, 3] and I want to get [1, 2, 3] -- [1, 2, 3] -- [1, 2, 3]

I have tried to add a setter with an inout parameter to my classes but I get the same result...

Upvotes: 0

Views: 2495

Answers (2)

Connor
Connor

Reputation: 64644

Swift Arrays are pass by value so they don't really work that way without some finagling. You could also try using NSMutableArray, which you can pass by reference, but that has its own drawbacks such as only holding AnyObjects.

class A {
    var arr = NSMutableArray()

    func fill() {
        arr.addObject(2)
    }
}

class B {
    var arr = NSMutableArray()

    func fill() {
        arr.addObject(3)
    }
}

var arr: NSMutableArray = [1]

var a = A()
a.arr = arr
a.fill()

var b = B()
b.arr = arr
b.fill()

println("\(arr) -- \(a.arr) -- \(b.arr)")

Upvotes: 2

Duyen-Hoa
Duyen-Hoa

Reputation: 15784

class A {
    var myC : C?;

    func fill(inout a:[Int]) {
        a += 2
    }

    func updateC(c : C) {
        fill(&c.arr)
        myC = c;
    }
}

class B {
    var myC : C?;

    func fill(inout a:[Int]) {
        a += 3
    }

    func updateC(c : C) {
        fill(&c.arr)
        myC = c;
    }
}


class C {
    var arr = [Int]()

}

and in another class:

var c = C()
c.arr = [1]

var a = A()
a.updateC(c)

var b = B()
b.updateC(c)

println("\(c.arr) -- \(a.myC!.arr) -- \(b.myC!.arr)")

It should print the same values.

Upvotes: 3

Related Questions