Por que "print" não é um método, mas um crime contra o tempo
\nSejamos honestos: cada um de nós já escreveu print("aqui_nunca_vai_entrar") pelo menos uma vez na vida e esperou que funcionasse. Às vezes, funcionava. Mas em projetos sérios, essa abordagem transforma o código em uma árvore de Natal com pisca-piscas de logs. A depuração de Swift é uma arte, e hoje vamos dissecá-la do início ao fim. Você aprenderá a parar de adivinhar e começar a "debugar" aplicativos iOS profissionalmente.
Este artigo é para quem programa em Swift, mas sente que o Xcode pode fazer mais. Não vamos ensinar o básico — vamos mostrar como a depuração de código Swift pode ser rápida, eficiente e até divertida. Vamos nessa!
\n\n1. Pontos de interrupção condicionais: seu detetive particular
\nUm breakpoint comum interrompe a execução toda vez que chega a uma linha. E se o bug só aparecer na 1000ª chamada de uma função? Ou apenas quando userId == 42? É aí que entram os pontos de interrupção condicionais em Swift.
Clique com o botão direito no breakpoint → selecione "Edit Breakpoint" → insira a condição.
\n\nExemplo: capturando um bug em um loop
\nfor index in 0..<items.count {\n processItem(items[index]) // Bug quando index == 5\n}\nColoque um breakpoint na linha processItem e insira a condição: index == 5. Agora o depurador parará exatamente onde é necessário. Sem pressionamentos desnecessários de F6.
Blocos de ação: tornando o breakpoint mais inteligente
\nNa mesma janela de edição, há o botão "Add Action". Você pode:
\n- \n
- Executar
po variableName(print object) — exibe automaticamente o valor da variável. \n - Reproduzir um som (sim, é verdade!) — útil quando a depuração está em segundo plano. \n
- Registrar uma mensagem no log — sem interromper a execução. \n
Ative a opção "Automatically continue after evaluating" — e você terá um super-logger que não trava o aplicativo.
\n\n2. LLDB: o console que sabe tudo
\nMuitos desenvolvedores ignoram o console de depuração, pensando que só existem po e p. Na verdade, o LLDB (Low Level Debugger) é o canivete suíço da depuração de Swift. Aqui estão 5 comandos que mudarão sua vida:
- \n
po— imprime o objeto chamandodescriptionoudebugDescription. Ideal para objetos UIKit. \n p— imprime o valor, mas sem chamardescription. Útil para tipos primitivos. \n v— mostra as variáveis no frame atual. Mais rápido do que olhar no painel Variables. \n expression— executa qualquer código Swift diretamente durante a pausa. Quer alterar o valor de uma variável?expression self.title = "Novo título". \n thread backtrace— mostra a pilha de chamadas. Se o aplicativo crashou, isso é a primeira coisa a fazer. \n
Exemplo ao vivo: alterando a UI em tempo real
\nImagine: você parou em um breakpoint no viewDidLoad. No console, digite:
expression self.view.backgroundColor = .red\nexpression self.view.layoutIfNeeded()\nE pronto! A tela do simulador muda instantaneamente para vermelho. Assim, você pode testar animações, cores e textos sem reiniciar.
\n\n3. View Debugging: espiando por baixo do capô da UI
\nBug de layout é um clássico. O botão não está no lugar certo, o label sobrepõe a imagem, ou as constraints se comportam como guerrilheiras. O View Debugging no Xcode é um raio-X para sua interface.
\nClique no botão "Debug View Hierarchy" (parece três quadrados) no painel inferior. Você verá uma cena 3D de todos os elementos da UI. Pode girar, ampliar, destacar constraints e ver seus valores numéricos.
\n\nTécnica: "Pegue a constraint"
\nSe um elemento não está no lugar certo, selecione-o na cena 3D e veja a lista de constraints. Linhas vermelhas indicam conflitos, li