Есть ли в Swift эквивалент passUnretained () для типов значений? - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь сделать несколько базовых доказательств, и поэтому я хотел бы иметь возможность получить ячейки памяти переменных и констант.

Вот простой пример такого рода вещейчто я смотрю:

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)") }

, на меня кричит компилятор.По сути, вопрос, о котором писал Мартин.

...