Xcode 'po' не может определить переменную, которую я хочу изучить. WNY?
Окружающая среда: Xcode 6 Beta 4
Я пытаюсь просто взглянуть на текстовое значение, используя
отладчик. Однако отладчик не может идентифицировать статическую переменную (через "Let" ). Это справедливо и для vars.
Почему?
func textFieldShouldReturn(textField:UITextField) -> Bool {
let myText = "Hello World"
let theText = textField.text! as String
return true
}
Результат отладчика:
(lldb) po textField error:: 1:1: ошибка: использование неразрешенных Идентификатор textField textField ^: 11: 5: ошибка: использование неразрешенный идентификатор '$ __ lldb_injected_self' $ __ lldb_injected_self. $__ lldb_wrapped_expr_29 (
^ (lldb) po myText error:: 1:1: ошибка: использование неразрешенного идентификатора 'myText' myText ^: 11: 5: ошибка: использование неразрешенных идентификатор '$ __ lldb_injected_self' $ __ lldb_injected_self. $__ lldb_wrapped_expr_30 (
^ (lldb) po theText error:: 1:1: ошибка: использование неразрешенного идентификатора 'theText' theText ^: 11: 5: ошибка: использование неразрешенных идентификатор '$ __ lldb_injected_self' $ __ lldb_injected_self. $__ lldb_wrapped_expr_31 (
^ (lldb)
Примечание. Отладочный вывод установлен на "Все выходы".
Вот скриншот:
![enter image description here]()
Ответы
Ответ 1
Это проблема, с которой я столкнулся, и я думаю, что это ошибка в отладчике. Если вы не используете ЛЮБЫЕ переменные, объявленные с помощью "let", команда po будет работать. Это не то, чего вы хотите, поэтому я подал ошибку с Apple по этой проблеме.
Я думаю, вам стоит просто надеяться, что он будет исправлен в следующей бета-версии (напишите ошибку, пожалуйста, так как количество зарегистрированных ошибок повлияет на приоритет Apple при их исправлении). В то же время перейдите к обходному пути Amitays.
Ответ 2
Как подтверждают другие выше, это в значительной степени является ошибкой в Swift/LLDB. Это в основном работало с 6.1.1, сломалось до или до 6.3 Beta 1 и снова исправлено в 6.3 Beta 2.
Я просто использую приложение командной строки в качестве теста и не могу тестировать с помощью UIKit, но я видел подобные проблемы вне UIKit - и по проблемам я имею в виду, что получил результаты, подобные OP, но теперь это работая:
struct Foobar {
var foo:String
var bar:String
}
func textFieldShouldReturn() -> Bool {
let fubar = Foobar(foo: "Onesy", bar: "Twosy")
let myText = "Hello World"
return true
}
textFieldShouldReturn()
p и po дают несколько разные результаты и зависят от того, выполняется ли Printable:
(lldb) po fubar
(foo = "Onesy", bar = "Twosy")
(lldb) p fubar
(AssertClientMacDirect.Foobar) $R1 = (foo = "Onesy", bar = "Twosy")
В потоке здесь: https://devforums.apple.com/message/1111705#1111705, вы также можете использовать команду image lookup -t <SymbolName>
image lookup -t Fubar
<path redacted>
id = {0x1000003e0}, name = "AssertMac.Fubar", byte-size = 8, clang_type = "class Fubar {
class func `new`(name: Swift.String) -> AssertMac.Fubar
init(name: Swift.String)
func test()
var someValue: Swift.String
var name: Swift.String
@objc deinit
}
Следует подчеркнуть, что вам следует дважды проверить, что для компилятора Swift установлено значение:
- Отладка/Оптимизация → Нет,
- Символы с разделителями на копии → НЕТ,
- Оптимизация времени связи → Нет
- Символы Strip на Install → NO, (для отладочных сборников, где это необходимо)
Если вы реализуете Printable в классе swift, вы получите результаты свойства описания.
Были предыдущие ошибки Xcode, в которых Xcode сбой при попытке выполнить оптимизированный код.