Я пытаюсь сделать несколько базовых доказательств, и поэтому я хотел бы иметь возможность получить ячейки памяти переменных и констант.
Вот простой пример такого рода вещейчто я смотрю:
import Foundation
class A {
var a: Int = 0
let b: Int = 3
var description: String {
return "a: is \"\(a)\", b is \"\(b)\""
}
}
struct B {
var a: Int = 0
let b: Int = 3
var description: String {
return "a: is \"\(a)\", b is \"\(b)\""
}
}
let classInstance = A()
let structInstance = B()
print(Unmanaged.passUnretained(classInstance).toOpaque())
print(Unmanaged.passUnretained(structInstance).toOpaque())
Проблема со вторым print(Unmanaged.passUnretained(structInstance).toOpaque())
Мне сказали, что я не могу передать структурную константу в.
Fair 'nuff. Документы говорят так:
Декларация
static func passUnretained(_ value: Instance) -> Unmanaged<Instance>
Параметры
- значение Экземпляр класса.
Возвращаемое значение Неуправляемая ссылка на объект, переданный в качестве значения.
Как видите, он настаивает на экземпляре класса.
Мой вопрос заключается в том, что я хотел бы также просмотреть адрес памяти структуры.
Причина этого в том, что я пытаюсь создать игровую площадку, которая иллюстрирует, как вся структура перемещается, если вы меняете член var.
Я использую Swift 4.2.
РЕДАКТИРОВАТЬ
Ах.Теперь я помню.
Важно, чтобы значения создавались с использованием let
(константа).Идея состоит в том, чтобы показать, что фактическая структура копируется при изменении элемента данных.
Мы будем предполагать, что все вышесказанное выполняется до двух let
объявлений:
withUnsafePointer(to: classInstance) { print("value \(classInstance) has address: \($0)") }
withUnsafePointer(to: structInstance) { print("value \(structInstance) has address: \($0)") }
Работает, но отображает один и тот же адрес для обоих:
value __lldb_expr_5.A has address: 0x00007ffee462ed38
value B(a: 0, b: 3) has address: 0x00007ffee462ed38
Если я пытаюсь отправить ссылки:
withUnsafePointer(to: &classInstance) { print("value \(classInstance) has address: \($0)") }
withUnsafePointer(to: &structInstance) { print("value \(structInstance) has address: \($0)") }
, на меня кричит компилятор.По сути, вопрос, о котором писал Мартин.