Como passar em uma entrevista de Swift: principais perguntas
A entrevista para a posição de desenvolvedor iOS não é apenas um teste de conhecimento de frameworks, mas também uma compreensão profunda da linguagem Swift. Os empregadores querem ver um candidato que entenda de gerenciamento de memória, concorrência e particularidades da sintaxe. Neste artigo, reunimos as principais perguntas frequentemente feitas em entrevistas, com respostas detalhadas e exemplos de código. O artigo será útil tanto para juniors quanto para desenvolvedores experientes que desejam revisar os conhecimentos antes da entrevista.
1. Fundamentos do Swift: tipos, optionals e gerenciamento de memória
As perguntas básicas verificam o quão bem você entende os conceitos fundamentais da linguagem. Vamos começar com o mais popular — optionals.
Pergunta 1: O que são optionals e para que servem?
Resposta: Optionals são um mecanismo de segurança de tipos que permite que uma variável contenha um valor ou seja nil (ausência de valor). Eles resolvem o problema de ponteiros nulos, comum em outras linguagens.
// Declaração de um optionalvar name: String? = "Ana"name = nil // agora a variável não contém valor
// Extração segura (optional binding)if let unwrappedName = name { print("Olá, \\(unwrappedName)")} else { print("Nome ausente")}
// Extração forçada (force unwrap) — perigoso!// let forcedName = name! // crash se name == nilPergunta 2: Qual a diferença entre struct e class?
Resposta: struct é um tipo de valor (value type), enquanto class é um tipo de referência (reference type). Structs são copiadas na atribuição, classes são passadas por referência. Além disso, classes suportam herança, mas structs não.
struct Point { var x: Int var y: Int}
class Person { var name: String init(name: String) { self.name = name }}
var pointA = Point(x: 1, y: 2)var pointB = pointA // cópiapointB.x = 10print(pointA.x) // 1 — o original não mudou
var personA = Person(name: "João")var personB = personA // referência ao mesmo objetopersonB.name = "Pedro"print(personA.name) // "Pedro" — mudouPergunta 3: Como funciona o Automatic Reference Counting (ARC)?
Resposta: O ARC conta automaticamente o número de referências fortes para um objeto de classe. Quando o contador chega a zero, o objeto é liberado da memória. Problemas surgem com referências cíclicas (retain cycles), que são resolvidas usando referências weak ou unowned.
class Parent { var child: Child?}
class Child { weak var parent: Parent? // weak previne retain cycle}
var parent: Parent? = Parent()var child: Child? = Child()parent?.child = childchild?.parent = parent2. Conceitos avançados: closures, protocolos e generics
Na próxima etapa, o entrevistador verifica se você sabe usar os recursos funcionais do Swift.
Pergunta 4: O que são closures e como elas capturam valores?
Resposta: Uma closure é um bloco de código que pode ser passado e usado como uma função. Ela captura (captures) variáveis do contexto ao redor. A captura pode ser forte ou fraca.
func makeIncrementer(incrementAmount: Int) -> () -> Int { var total = 0 let incrementer: () -> Int = { total += incrementAmount // captura de total return total } return incrementer}
let incrementByTwo = makeIncrementer(incrementAmount: 2)print(incrementByTwo()) // 2print(incrementByTwo()) // 4Pergunta 5: Qual a diferença entre um protocolo e uma classe abstrata?
Resposta: Em Swift não existem classes abstratas. Um protocolo define um contrato (requisitos) que deve ser implementado por classes, structs ou enums.