Параметры Inout не имеют одинаковый адрес

У меня есть три класса A, B и C. A имеет ресурс под названием rA. Я пытаюсь добиться того, чтобы все эти экземпляры имели ссылку на один и тот же ресурс.

Итак, к конкретике в кратчайшие сроки:

Класс A имеет свойство с именем foo:

private var foo : [Bar] = [Bar]() // shared resource

Класс B имеет свойство с именем foo, которое передается в инициализатор в качестве параметра inout:

private var foo : [Bar]!
init(inout foo:[Bar]){
    self.foo = foo
}

Класс C аналогичен классу B

Как же, если я пройду foo с класса A на класс B (или C) адрес меняется?

В AI передал бы это B (или C) так:

let b = B(foo: &self.foo)

Когда я печатаю адрес после инициализации foo в A это дает мне другой адрес, чем после назначения в B.

class A{
    private var foo = [Bar]()
    func someFunc(){
        NSLog("\n\n [A] \(unsafeAddressOf(self.foo))\n\n") // different from output in B
        let b = B(foo: &self.foo)

    }
}

class B{
    private var foo: [Bar]!
    init(inout foo: [Bar]){
         self.foo = foo
         NSLog("\n\n [B] \(unsafeAddressOf(self.foo))\n\n")
    }
}

Есть идеи, почему это так?

1 ответ

Решение

Быстрые массивы являются типами значений, поэтому в

self.foo = foo

Вы назначаете значение foo в self.foo, Теперь это два независимых массива (даже если фактические элементы копируются только тогда, когда один из массивов мутирован).

Также вы не можете взять адрес массива Swift с unsafeAddressOf() потому что эта функция занимает AnyObject параметр, который является экземпляром класса, то есть тип значения. В

 unsafeAddressOf(self.foo)

компилятор Swift фактически соединяет массив Swift с NSArray, Как показано в Swift, Strings и Address Addresses, это может или не может привести к одному и тому же объекту при повторном выполнении. В любом случае, напечатанный адрес не является местом хранения массива Swift.

Если вам нужна реальная ссылка, которую вы можете передать, тогда вы можете заключить массив в класс. С помощью NS(Mutable)Array может также быть вариантом, но тогда вы потеряете много функций Swift.

Другие вопросы по тегам