Introdução: por que o code review é importante para o desenvolvedor Swift
\n\nCode review (revisão de código) é o processo no qual um ou mais desenvolvedores verificam o código escrito por um colega antes que ele seja integrado ao branch principal do projeto. Para desenvolvedores iOS/macOS iniciantes, isso não é apenas uma formalidade, mas uma poderosa ferramenta de aprendizado e melhoria da qualidade do código.
\n\nNo ecossistema Swift, onde a tipagem forte e a segurança de memória são prioridades, o code review ajuda a identificar não apenas erros lógicos, mas também problemas com o uso de ARC (Automatic Reference Counting), tipos opcionais e concorrência. Neste artigo, vamos abordar exatamente o que verificar no código Swift e como dar feedback de forma útil e construtiva.
\n\nAspectos principais do code review em Swift
\n\n1. Limpeza do código e conformidade com o estilo Swift
\n\nAntes de tudo, o código deve ser legível. Em Swift, existem convenções claras de nomenclatura descritas nas API Design Guidelines da Apple. O que verificar:
\n\n- \n
- Nomes de variáveis e funções devem ser claros e expressivos. Evite abreviações como
btn— usesubmitButton. \n - Ordem das declarações: propriedades, inicializadores, métodos, subclasses. Use
// MARK:para agrupar. \n - Uso de espaços e indentação. A comunidade Swift prefere 4 espaços (ou 2 em algumas equipes), mas o importante é a consistência. \n
- Evite force unwrapping (
!) sem necessidade explícita. Prefira usarguard letouif let. \n
Exemplo de estilo ruim e bom:
\n\n// Ruim\nvar x: String!\nfunc doSomething() { print(x!) }\n\n// Bom\nvar username: String?\nfunc printUsername() {\n guard let name = username else { return }\n print(name)\n}\n\n\n2. Segurança no gerenciamento de memória e ARC
\n\nSwift usa contagem automática de referências (ARC), mas isso não significa que você pode esquecer dos ciclos de referência forte. Ao fazer code review, verifique sempre:
\n\n- \n
- Closures: se uma closure captura
selfeselfretém a closure, ocorre um ciclo. Use[weak self]ou[unowned self]. \n - Delegados: quase sempre devem ser fracos (
weak var delegate). \n - Caches e observadores: remova assinaturas do
NotificationCenterou KVO ao desinicializar o objeto. \n
class NetworkManager {\n var onComplete: (() -> Void)?\n\n func fetchData() {\n // PERIGOSO: referência forte a self\n URLSession.shared.dataTask(with: url) { data, _, _ in\n self.handleResponse(data) // ciclo!\n }\n \n // SEGURO\n URLSession.shared.dataTask(with: url) { [weak self] data, _, _ in\n self?.handleResponse(data)\n }\n }\n}\n\n\n3. Tratamento de erros e tipos opcionais
\n\nSwift oferece um sistema poderoso de tratamento de erros com do-catch e tipos opcionais. No code review, verifique:
- \n
- Todos os erros foram tratados? Use
try?apenas se você estiver preparado paranil. \n try!não está sendo usado em código de produção? Isso é quase sempre uma má prática. \n - As cadeias opcionais foram tratadas corretamente? Evite aninhamento profundo de
if let— useguardpara saída antecipada. \n
// Em vez disso:\nif let data = response.data {\n if let json = try? JSONSerialization.jsonObject(with: data) {\n i