> swift-best-practices
Apply Guard, Value Types, Immutability, and Naming conventions in Swift. Use when writing idiomatic Swift using guard, value types, immutability, or naming conventions. (triggers: **/*.swift, guard, let, struct, final)
curl "https://skillshub.wtf/HoangNguyen0403/agent-skills-standard/swift-best-practices?format=md"Swift Best Practices
Priority: P0
Implementation Guidelines
Control Flow (Guard over If)
- Guard for Early Exit: Use
guard letover nested if statements for better readability and to unwrap optionals early. - Nested Checks: Use
guardfor precondition checks at the top of a function to reduce nested depth. - Switch Exhaustiveness: Always handle all cases; use
@unknown defaultfor freezing enums (enums from frameworks). - if-case: Use
if case .success(let value) = resultfor simple enum pattern matching.
Value Types & Immutability
- Prefer Structs: Default to struct for value semantics and thread safety. Use
classonly when reference identity or inheritance is required. - Immutability: Always default to let for all properties and constants. Use
varonly when change is required. - Modifiers: Use
finalfor all classes that are not intended to be subclassed to improve performance (static dispatch). - Static Dispatch: Favor methods in structs and
finalclasses.
Naming & Style
- Clear Intent: Prefix booleans with
is, has, or can. Example:isValid,hasErrors,canEdit. Makes boolean state clear. - API Guidelines: Follow the official Swift API Design Guidelines. Use
camelCasefor clear names andPascalCasefor types. - Protocols: Name protocols with
-able,-ible, or-ingsuffixes (e.g.,Codable,Identifiable). - Opaque Types: Use
some Vieworsome Collectionfor return types where the underlying type is internal.
Collection Performance
- Sequence API: Use
compactMap,filter, andreduceinstead of explicit for-where loops for data transformations. - Lazy Collections: Use
.lazyfor large sequences when the result is consumed partially. - Dictionaries: Use
defaultvalues in dictionary access to avoid double optional unwrapping.
Anti-Patterns
- No Pyramid of Doom: Use
guardfor early exits. - No force unwrap: Never use
!on optionals. Use??(nil-coalescing) orif let. - No global var: Avoid mutable global state. Use Singletons (accessed via
static let shared) or DI.
References
> related_skills --same-repo
> common-store-changelog
Generate user-facing release notes for the Apple App Store and Google Play Store by collecting git history, triaging user-impacting changes, and drafting store-compliant changelogs. Enforces character limits (App Store ≤4000, Google Play ≤500), tone, and bullet format. Use when generating release notes, app store changelog, play store release, what's new, or version release notes for any mobile app. (triggers: generate changelog, app store notes, play store release, what's new, release notes, ve
> golang-tooling
Go developer toolchain — gopls LSP diagnostics, linting, formatting, and vet. Use when setting up Go tooling, running linters, or integrating gopls with Claude Code. (triggers: gopls, golangci-lint, golangci.yml, go vet, goimports, staticcheck, go tooling, go lint)
> common-ui-design
Design distinctive, production-grade frontend UI with bold aesthetic choices. Use when building web components, pages, interfaces, dashboards, or applications in any framework (React, Next.js, Angular, Vue, HTML/CSS). (triggers: build a page, create a component, design a dashboard, landing page, UI for, build a layout, make it look good, improve the design, build UI, create interface, design screen)
> common-owasp
OWASP Top 10 audit checklist for Web Applications (2021) and APIs (2023). Load during any security review, PR review, or codebase audit touching web, mobile backend, or API code. (triggers: security review, OWASP, broken access control, IDOR, BOLA, injection, broken auth, API review, authorization, access control)