swift
Ajuda seu agente a desenvolver apps para iOS usando Swift. Essencial para criar aplicativos nativos para iPhones e iPads. Permite construir interfaces e funcionalidades modernas.
O que ela faz
Este guia ensina como escrever código Swift de forma mais eficiente e correta, seguindo as melhores práticas da linguagem. Ele mostra como usar recursos como 'Optionals' e 'Concorrência' de maneira eficaz.
Quando usar
- ✓Quando você quer escrever código Swift mais limpo e seguro.
- ✓Para aprender as formas recomendadas de lidar com valores que podem ou não existir (Optionals).
- ✓Ao trabalhar com tarefas que acontecem ao mesmo tempo (Concorrência).
Exemplo do que pedir para a IA
“Como posso garantir que meu código Swift lide corretamente com valores que podem não existir?”
Quer saber mais? Abra as seções abaixo.
Como usar
O jeito mais fácil: copie a mensagem abaixo e cole no Claude, ChatGPT, Cursor ou outra IA. Ela lê a skill e segue as instruções.
Link da skill
Mensagem pronta para colar
Como funciona
O guia compara exemplos de código 'ruim' com exemplos 'bons' para ilustrar as melhores práticas. Ele foca em como usar as ferramentas da linguagem Swift de forma mais inteligente para evitar erros comuns.
Instalação
Jeito mais fácil: copie o link da skill e cole no Claude, ChatGPT ou Cursor pedindo para seguir as instruções.
No terminal (Claude Code, Codex, Cursor), na pasta do projeto:
npx skills add sickn33/agentic-awesome-skills --skill swiftOu baixe só o arquivo:
curl -L https://raw.githubusercontent.com/sickn33/agentic-awesome-skills/main/plugins/agentic-awesome-skills-claude/skills/super-code/swift/SKILL.md -o SKILL.mdConteúdo técnico (SKILL.md)
Tradução do texto original do autor no GitHub. Os comandos e códigos estão como no original.
Swift: Referência de Eficiência Idiomática
Quando Usar
- Use esta habilidade quando a tarefa corresponder a esta descrição: Diretrizes de supercódigo específicas da linguagem para Swift.
Índice
- Opcionais
- Coleções e Transformações Funcionais
- Tipos de Valor vs. Tipos de Referência
- Tratamento de Erros
- Concorrência
- Design Orientado a Protocolos
- Antipadrões Específicos do Swift
1. Opcionais {#optionals}
// ❌ Force unwrap
let name = user.name!
// ✅ — guard or if-let
guard let name = user.name else { return }
// ❌ Nested if-let pyramid
if let user = fetchUser() {
if let address = user.address {
if let city = address.city {
display(city)
}
}
}
// ✅ — chained optional binding
if let city = fetchUser()?.address?.city {
display(city)
}
// or guard-let for early exit
guard let city = fetchUser()?.address?.city else { return }
display(city)
// ❌ Ternary for default
let name = user.name != nil ? user.name! : "Unknown"
// ✅
let name = user.name ?? "Unknown"
// ❌ Optional map when if-let is clearer for side effects
user.name.map { display($0) }
// ✅ — map for transforms, if-let for side effects
let upper = user.name.map { $0.uppercased() }
if let name = user.name { display(name) }
2. Coleções e Transformações Funcionais {#collections}
// ❌ Imperative filter + map
var result: [String] = []
for item in items {
if item.isActive { result.append(item.name.uppercased()) }
}
// ✅
let result = items
.filter(\.isActive)
.map { $0.name.uppercased() }
// ❌ Manual dictionary construction
var dict: [String: User] = [:]
for user in users { dict[user.id] = user }
// ✅
let dict = Dictionary(uniqueKeysWithValues: users.map { ($0.id, $0) })
// or with possible duplicates:
let dict = Dictionary(grouping: users, by: \.department)
// ❌ Checking isEmpty then accessing first
if !items.isEmpty { process(items[0]) }
// ✅
if let first = items.first { process(first) }
// ❌ Index-based loop
for i in 0..<items.count { process(items[i]) }
// ✅
for item in items { process(item) }
// with index:
for (i, item) in items.enumerated() { process(i, item) }
Use caminhos de chave (\.isActive) como atalhos de closure onde suportado.
3. Tipos de Valor vs. Tipos de Referência {#value-types}
// ❌ Class for plain data (reference semantics where value semantics suffice)
class Point {
var x: Double
var y: Double
init(x: Double, y: Double) { self.x = x; self.y = y }
}
// ✅
struct Point { var x, y: Double }
// ❌ Large struct copied repeatedly (performance hit)
struct HugeData { var buffer: [UInt8] /* thousands of elements */ }
func process(_ data: HugeData) { ... } // copies entire buffer
// ✅ — use class or pass inout for mutation
func process(_ data: inout HugeData) { ... }
// or use copy-on-write wrapper for large value types
Use por padrão struct. Use class quando precisar de identidade, herança ou semântica de referência.
4. Tratamento de Erros {#errors}
// ❌ Using optionals to mask errors
func parse(_ input: String) -> Data? { ... } // caller doesn't know why it failed
// ✅
func parse(_ input: String) throws -> Data { ... }
// ❌ try! in production code
let data = try! JSONDecoder().decode(User.self, from: jsonData)
// ✅
do {
let data = try JSONDecoder().decode(User.self, from: jsonData)
} catch {
logger.error("decode failed: \(error)")
throw AppError.decodingFailed(underlying: error)
}
// ❌ Generic Error type
enum AppError: Error { case generic(String) }
// ✅ — specific, actionable error cases
enum AppError: Error {
case networkUnreachable
case invalidInput(field: String, reason: String)
case unauthorized
}
// ❌ Catching all errors and ignoring
do { try riskyOperation() } catch { }
// ✅
do {
try riskyOperation()
} catch let error as NetworkError {
handleNetworkError(error)
} catch {
throw error // rethrow unknown
}
5. Concorrência {#concurrency}
// ❌ Assíncrono baseado em callback (pirâmide da perdição)
fetchUser { user in
fetchPosts(for: user) { posts in
fetchComments(for: posts.first!) { comments in
display(comments)
}
}
}
// ✅ (Swift 5.5+)
let user = try await fetchUser()
let posts = try await fetchPosts(for: user)
…
Perguntas frequentes
O que são 'Optionals' em Swift?
'Optionals' são uma forma em Swift de dizer que uma variável pode ter um valor ou pode não ter nenhum valor (ser nula). O guia mostra como lidar com isso de forma segura.
O que é 'Concorrência' em Swift?
'Concorrência' é a capacidade de executar múltiplas tarefas ao mesmo tempo. O guia explica como fazer isso de forma eficiente em Swift usando as ferramentas mais recentes.
Por que usar 'structs' em vez de 'classes' em Swift?
Geralmente, 'structs' são preferíveis em Swift para dados simples porque funcionam com cópia (valor), o que pode ser mais seguro e previsível. 'Classes' são usadas quando você precisa de compartilhamento e identidade.
Detalhes
Descrição original do autor
Language-specific super-code guidelines for swift.
Popularidade
- Estrelas no GitHub
- 48 mil
- Posição no ranking
- #4286
- Licença
- MIT
- Atualizada em
- 15/10/2026
Comentários
- …
Mais skills deste repositório
00-andruia-consultant
Ajuda seu agente a iniciar ou melhorar projetos de IA. Ele analisa código, sugere ferramentas e cria planos de ação em espanhol.
sickn33/agentic-awesome-skills
007
Faz seu agente realizar auditorias de segurança e modelagem de ameaças. É útil para proteger projetos contra ataques e vulnerabilidades.
sickn33/agentic-awesome-skills
10-andruia-skill-smith
Ajuda seu agente a criar ou melhorar ferramentas de IA. Ele define como as ferramentas funcionam, escreve a documentação e valida a estrutura.
sickn33/agentic-awesome-skills
20-andruia-niche-intelligence
Faz seu agente criar um resumo sobre um setor específico. É útil para entender o contexto, regras, padrões de uso e riscos de um projeto, usando fontes confiáveis.
sickn33/agentic-awesome-skills
Skills parecidas
benchmark-optimization-loop
Faz seu agente melhorar a velocidade de algo de forma medida. Ele testa várias versões e escolhe a mais rápida que ainda funciona corretamente.
affaan-m/ECC
change-impact
Ajuda seu agente a analisar o impacto de mudanças no código antes de fazê-las. Ele compara o planejado com o real depois, cobrindo caminhos, dados, testes e documentação. É útil para mudanças arriscadas ou que afetam várias partes do sistema.
affaan-m/ECC
click-path-audit
Faz seu agente rastrear todos os botões e interações do usuário para achar bugs. Ele encontra problemas onde funções parecem funcionar sozinhas, mas falham juntas. Útil quando bugs persistem mesmo após depuração.
affaan-m/ECC