npx skills add ...
npx skills add johnrogers/claude-swift-engineering --skill swift-style
Swift code style conventions for clean, readable code. Use when writing Swift code to ensure consistent formatting, naming, organization, and idiomatic patterns.
npx skills add johnrogers/claude-swift-engineering --skill swift-style
Code style conventions for clean, readable Swift code.
Clarity > Brevity > Consistency
Code should compile without warnings.
UpperCamelCase — Types, protocolslowerCamelCase — Everything elseLeft-hand margin is the happy path. Don't nest if statements.
Use extensions and MARK comments:
Avoid self unless required by compiler.
Omit get for read-only:
Trailing closure only for single closure parameter.
Let compiler infer when clear. For empty collections, use type annotation:
private over fileprivateinternal (it's the default)// or ///, avoid /* */Use case-less enum for namespacing:
Abbreviations beyond URL, ID, UUID — Abbreviations like cfg, mgr, ctx, desc hurt readability. Spell them out: configuration, manager, context, description. The three exceptions are URL, ID, UUID.
Nested guard/if statements — Deep nesting makes code hard to follow. Use early returns and guards to keep the happy path left-aligned.
Inconsistent self usage — Either always omit self (preferred) or always use it. Mixing makes code scanning harder and confuses capture semantics.
Overly generic type names — Manager, Handler, Helper, Coordinator are too vague. Names should explain responsibility: PaymentProcessor, EventDispatcher, ImageCache, NavigationCoordinator.
Implied access control — Don't skip access control. Explicit private, public helps future maintainers understand module boundaries. internal is default, so omit it.
// Preferred
func process(value: Int?) throws -> Result {
guard let value = value else {
throw ProcessError.nilValue
}
guard value > 0 else {
throw ProcessError.invalidValue
}
return compute(value)
}class MyViewController: UIViewController {
// Core implementation
}
// MARK: - UITableViewDataSource
extension MyViewController: UITableViewDataSource { }// Preferred
func configure() {
backgroundColor = .systemBackground
}var diameter: Double {
radius * 2
}var names: [String] = []// Preferred
var items: [String]
var cache: [String: Int]
var name: String?resource.request().onComplete { [weak self] response in
guard let self else { return }
self.updateModel(response)
}enum Math {
static let pi = 3.14159
}