Параметры 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.