Параметр универсальной функции в Swift указывает на недопустимую память

Я начну с примера установки.

class Parent {
    let parentProperty = 1
}
class Child : Parent {
    let childProperty = 2
}
class Test {
    func testMethod<T : Parent>(data: T) {
        // (llbd) print data
    }
}

let child = Child()
let test = Test()
// (lldb) print child
test.testMethod(child)

I paused execution on places marked with comment » (lldb) print …»и выполняется команда» print child / data » в консоли отладчика в Xcode.

Выходные данные этих команд перечислены ниже.

// печать ребенка

(RingRingTests.Child) $R0 = 0x00007fcb886459a0 {
  RingRingTests.Parent = {
    parentProperty = 1
  }
  childProperty = 2
}

// данные печати

(RingRingTests.Child) $R1 = 0x0000000115a93818 {
  RingRingTests.Parent = {
    parentProperty = 140512143366480
  }
  childProperty = 4294967299
}

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

Это похоже на то, что самая базовая настройка для универсальной функции swift, тем не менее она терпит неудачу.

Наверное, я делаю что-то фундаментально неправильное. Кто-нибудь может указать мне правильное направление? Спасибо!.

1 ответ

  1. Я попытался заменить предложенные lldb-тесты на простые старые отладочные выходные данные, и все работает хорошо.

    class Parent: CustomDebugStringConvertible {
        let parentProperty = 1
        var debugDescription: String { return "\(parentProperty)" }
    }
    class Child: Parent {
        let childProperty = 2
        override var debugDescription: String { return "\(parentProperty), \(childProperty)" }
    }
    class Test {
        func testMethod<T : Parent>(data: T) {
            print(data)
        }
    }
    
    let child = Child()
    let test = Test()
    print(child) // 1, 2
    test.testMethod(child) // 1, 2
    

    Некоторая оптимизация может завинчивать lldb-тесты, но оптимизацию не следует выполнять для отладочных сборок.

    Другими словами, мой ответ:»на самом деле с вашим кодом все в порядке, но, возможно, что-то не так с вашими тестами».