Chcę przekazać tablicę do obiektu i zapisać referencję do tej tablicy. Chcę móc modyfikować tę tablicę w tym obiekcie i upewnić się, że jest ona modyfikowana wszędzie indziej.Przechowywanie odwołania do tablicy w trybie szybkim
Oto co próbuję wykonać (jak kod nie działa)
class Foo {
var foo : Array<Int>
init(foo: Array<Int>) {
self.foo = foo
}
func modify() {
foo.append(5)
}
}
var a = [1,2,3,4]
let bar = Foo(a)
bar.modify()
print(a) // My goal is that it will print 1,2,3,4,5
moich ustaleń dotychczas
a) array (domyślnie) są przekazywane dziwny sposób. Jest to odniesienie, dopóki nie zmodyfikujesz długości tablicy. Po zmodyfikowaniu długości zostanie ona skopiowana i zmodyfikowana. W rezultacie, jeśli dodaję lub usuwam z niego cokolwiek w obiekcie, nie będzie można go zobaczyć poza BN2. Mogę użyć parametru inout
dla parametru funkcji. To pozwoli mi modyfikować go w ramach tej funkcji. Jednak, gdy tylko spróbuję przypisać go do jakiegoś elementu obiektu, znowu uderzy mnie A)
C) Mogę owinąć tablicę w jakiejś klasie Container. To prawdopodobnie jest najczystszy sposób. Jednakże serializuję/deserializuję te obiekty i wolałbym nie umieszczać ich w Container (ponieważ będę musiał obejść pewne rzeczy dla serializacji i deserializacji i wysłania ich na serwer).
Czy jest coś jeszcze? Czy brakuje mi konstrukcji Swift, która pozwala mi to zrobić?
Jak można by się spodziewać, że "a" zostanie oznaczone jako stała? Musiałbyś również przekazać go za pomocą parametru inout i przekazać go do swojej metody z prefiksem "&" –
Mogę zmienić "a" na var. Korzystanie z parametru & i inout będzie działało tylko wtedy, gdy zmienię tablicę tylko w metodzie, do której został przekazany. Jak tylko wykonam "self.foo = foo", przestanie działać. Znaczenie modyfikacji self.foo nie wpłynie na "a" –
oznaczyć jako var, define var foo: [Int] = [] {willSet (newArray) {a = newArray}} –