# Coding Styles ## Dot Alignment First variable in the chain is coupled with first function. All other functions must align with the first `.`. ```swift this.map { ... } .filter { ... } ``` ## Argument Alignment Up to 3 arguments allowed on a single line, more than 3 it should be multi-line. ```swift init( this: ... that: ... those: ... thems: ... ) ``` ## File Structure - Code files should be grouped by functionality not access level - Marks should have a hyphen to separate groupings - Functionality groupings should have a corresponding mark - Files greater than 100 lines of code should be marked ## Fixme & Todo - Fixmes should be used for deferred work that must be fixed before a release - Todos are deferred work that does not need to be fixed before a release - Fixmes and TODOs should have an accompanying ticket number for when it should be removed ## Documentation Styling - No new line is necessary between description and parameters - Extra callouts should have an empty line between them - Any example could should have a `### Example` header with a 3 back-tick code block - Callout Usage - Warning signals that something may break if not used according to the documentation - Note signals extra information that could help in the usage of an API - See Also signals extra documentation that may be necessary to understand an API - https://developer.apple.com/library/archive/documentation/Xcode/Reference/xcode_markup_formatting_ref/ ## Enum Cases Enum cases should be on their own line and prefixed with `case` for jazzy to properly generate documentation ```swift enum This { case that case those case them } ``` ## Test Naming - Test names should include the unit being tested, under the conditions being tested and the expected outcome - https://qualitycoding.org/unit-test-naming/ ## Optional Pipelines When unwrapping optionals in guard statements it is preferred to use chained flatmaps instead of creating intermediate variables. ``` // No guard let value = failingFunction(val), let value2 = failingFunction2(value), let value3 = failingFunction3(value2) else { return } // Yes guard let value = val.flatMap(failingFunction) .flatMap(failingFunction2) .flatMap(failingFunction3) else { return } ```