Swift Style Guide
Code style conventions for clean, readable Swift code.
Core Principles
Clarity > Brevity > Consistency
Code should compile without warnings.
Naming UpperCamelCase — Types, protocols lowerCamelCase — Everything else Clarity at call site No abbreviations except universal (URL, ID) // Preferred let maximumWidgetCount = 100 func fetchUser(byID id: String) -> User
Golden Path
Left-hand margin is the happy path. Don't nest if statements.
// 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) }
Code Organization
Use extensions and MARK comments:
class MyViewController: UIViewController { // Core implementation }
// MARK: - UITableViewDataSource extension MyViewController: UITableViewDataSource { }
Spacing Braces open on same line, close on new line One blank line between methods Colon: no space before, one space after Self
Avoid self unless required by compiler.
// Preferred func configure() { backgroundColor = .systemBackground }
Computed Properties
Omit get for read-only:
var diameter: Double { radius * 2 }
Closures
Trailing closure only for single closure parameter.
Type Inference
Let compiler infer when clear. For empty collections, use type annotation:
var names: [String] = []
Syntactic Sugar // Preferred var items: [String] var cache: [String: Int] var name: String?
Access Control private over fileprivate Don't add internal (it's the default) Access control as leading specifier Memory Management resource.request().onComplete { [weak self] response in guard let self else { return } self.updateModel(response) }
Comments Explain why, not what Use // or ///, avoid / / Keep up-to-date or delete Constants
Use case-less enum for namespacing:
enum Math { static let pi = 3.14159 }
Common Mistakes
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.