Создайте переменную экземпляра класса Swift с помощью lldb по сравнению с Objective-C

Используя мой отладчик (lldb), я могу легко создавать классы Instances, когда это код Objective-C.

(lldb) e id $my_hello = [hello_from_objc new]
(lldb) po $my_hello
<hello_from_objc: 0x1c4013020>
(lldb) po [$my_hello secret_objc_method]
0x000000000000002a
(lldb) po (int) [$my_hello secret_objc_method]
42

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

let my_swift_framework = Hello_Class()
print("✔️ \(my_swift_framework.samplePublicVariable)")

person rustyMagnet    schedule 15.06.2018    source источник


Ответы (1)


Вот пример: после выполнения кода Swift

class HelloClass {
    func hello() {
        print("hello")
    }
}

вы можете создать объект в окне отладчика:

(lldb) expression let $myHello = HelloClass()
(lldb) po $myHello
<hello_class: 0x101121180>

(lldb) po $myHello.hello()
hello

Если вы получили сообщение об ошибке

error: unknown type name 'let'
error: use of undeclared identifier 'HelloClass'

затем явно установите язык выражений на Swift:

(lldb) expression -l swift -o -- let $myHello = HelloClass()

(lldb) expression -l swift -o -- $myHello.hello()

Или вы можете изменить языковой контекст lldb обратно на Swift:

(lldb) settings set target.language swift

person Martin R    schedule 15.06.2018
comment
В парсерах выражений lldb C и Swift начальный $ используется в качестве индикатора пространства имен для постоянных переменных lldb. Это держит их подальше от программных переменных. Переменные, созданные в выражениях lldb без начального $, являются локальными для выражения. - person Jim Ingham; 17.06.2018
comment
это не сработало для меня. (ошибка: неизвестное имя типа 'let', ошибка: использование необъявленного идентификатора 'HelloClass' - даже если он был в таблице символов). Я попытался подключиться к приложению в режиме отладки с помощью xCode и lldb в командной строке с помощью lldb. Я также пробовал эту статью: stackoverflow.com/questions/29441418/ - person rustyMagnet; 18.06.2018
comment
@rustyMagnet: я проверил это с помощью приложения командной строки, запущенного непосредственно из Xcode. Я боюсь, что у меня нет лучшего решения в настоящее время. - person Martin R; 19.06.2018
comment
@MartinR Я нашел ответ. Кажется, что-то автоматически устанавливает выражение lldb -l после запуска appDelegate. - person rustyMagnet; 20.06.2018
comment
@rustyMagnet: Итак, -l swift наконец-то помог? Рад, что вы решили проблему! – (Но обратите внимание, что соглашения об именах Swift сильно отличаются от (например) Python, все идентификаторы используют верблюжий регистр – верхний верблюжий регистр для типов, нижний верблюжий регистр для всего остального :) - person Martin R; 20.06.2018
comment
спасибо @MartinR. Да, я думал, ты это заметишь. Я был непоследователен в своем деле, поэтому я просто вернулся к делу о верблюдах... - person rustyMagnet; 20.06.2018