我将从一个示例设置开始。
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)
我暂停了在标有注释"(lldb)print…"的地方执行,并在Xcode的调试器控制台中执行了"print child/data"命令。
以下列出了上述命令的输出。
//打印子
(RingRingTests.Child) $R0 = 0x00007fcb886459a0 {
RingRingTests.Parent = {
parentProperty = 1
}
childProperty = 2
}
//打印数据
(RingRingTests.Child) $R1 = 0x0000000115a93818 {
RingRingTests.Parent = {
parentProperty = 140512143366480
}
childProperty = 4294967299
}
子变量和数据变量显然指向内存中的不同位置。(数据指向某个无效内存)
这似乎是通用函数的最基本设置是swift,但它正在失败。
我想我做错了什么。有人能给我指正确的方向吗?非常感谢。
我尝试用简单的旧调试输出替换您提出的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测试,但不应针对调试构建进行优化。
换言之,我的答案是"代码其实没问题,但测试可能出了问题"。