Professional Documents
Culture Documents
Swift Conventions Highlight
Swift Conventions Highlight
Swift Conventions Highlight
md 11/27/2019
1 / 30
swift-conventions-highlight.md 11/27/2019
16.2.2 Optionals
16.2.3 Spacing
16.2.4 Loops
16.2.5 Closures
1. BundleID
Format: asia.vitalify.*
2. Naming
2.1 Delegates
Preferred:
Not Preferred:
Preferred:
Not Preferred:
2.3 Generics
2 / 30
swift-conventions-highlight.md 11/27/2019
Preferred:
Not Preferred:
2.4 Language
Preferred:
Not Preferred:
3. Code Organization
3.1 Protocol Conformance
Preferred:
// MARK: - UITableViewDataSource
extension MyViewController: UITableViewDataSource {
// table view data source methods
}
// MARK: - UIScrollViewDelegate
extension MyViewController: UIScrollViewDelegate {
// scroll view delegate methods
}
3 / 30
swift-conventions-highlight.md 11/27/2019
Not Preferred:
Preferred:
Not Preferred:
Preferred:
import UIKit
var view: UIView
var deviceModels: [String]
Preferred:
4 / 30
swift-conventions-highlight.md 11/27/2019
import Foundation
var deviceModels: [String]
Not Preferred:
import UIKit
import Foundation
var view: UIView
var deviceModels: [String]
Not Preferred:
import UIKit
var deviceModels: [String]
4. Spacing
Indent using 4 spaces rather than tabs to conserve space and help prevent line wrapping
Preferred:
if user.isHappy {
// Do something
} else {
// Do something else
}
Not Preferred:
if user.isHappy
{
// Do something
}
else {
// Do something else
}
Preferred:
Not Preferred:
Preferred:
Not Preferred:
6. Function Declarations
Preferred:
Not Preferred:
6 / 30
swift-conventions-highlight.md 11/27/2019
7. Closure Expressions
Preferred:
UIView.animate(withDuration: 1.0) {
self.myView.alpha = 0
}
Not Preferred:
8. Types
Preferred:
Less Preferred:
Not Preferred:
7 / 30
swift-conventions-highlight.md 11/27/2019
8.1 Constants
Preferred:
enum Math {
static let e = 2.718281828459045235360287
static let root2 = 1.41421356237309504880168872
}
Not Preferred:
8.2 Optionals
Preferred:
// later on...
if let subview = subview, let volume = volume {
// do something with unwrapped subview and volume
}
// another example
UIView.animate(withDuration: 2.0) { [weak self] in
guard let self = self else { return }
self.alpha = 1.0
}
Not Preferred:
}
}
// another example
UIView.animate(withDuration: 2.0) { [weak self] in
guard let strongSelf = self else { return }
strongSelf.alpha = 1.0
}
Preferred:
Not Preferred:
Preferred:
Not Preferred:
Preferred:
9 / 30
swift-conventions-highlight.md 11/27/2019
Not Preferred:
9. Functions vs Methods
Preferred
Not Preferred
Preferred
Not Preferred
10 / 30
swift-conventions-highlight.md 11/27/2019
Not Preferred
class TimeMachine {
private dynamic lazy var fluxCapacitor = FluxCapacitor()
}
Not Preferred:
class TimeMachine {
lazy dynamic private var fluxCapacitor = FluxCapacitor()
}
for _ in 0..<3 {
print("Hello three times")
}
11 / 30
swift-conventions-highlight.md 11/27/2019
Not Preferred:
var i = 0
while i < 3 {
print("Hello three times")
i += 1
}
var i = 0
while i < attendeeList.count {
let person = attendeeList[i]
print("\(person) is at position #\(i)")
i += 1
}
Preferred:
let value = 5
result = value != 0 ? x : y
Not Preferred:
12 / 30
swift-conventions-highlight.md 11/27/2019
Not Preferred:
return frequencies
} else {
throw FFTError.noInputData
}
} else {
throw FFTError.noContext
}
}
Preferred:
guard
let number1 = number1,
let number2 = number2,
let number3 = number3
else {
fatalError("impossible")
}
}
// do something with numbers
Not Preferred:
13 / 30
swift-conventions-highlight.md 11/27/2019
} else {
fatalError("impossible")
}
} else {
fatalError("impossible")
}
} else {
fatalError("impossible")
}
13. Semicolons
Preferred:
Not Preferred:
14. Parentheses
Preferred:
if name == "Hello" {
print("World")
}
Not Preferred:
if (name == "Hello") {
print("World")
}
Preferred:
14 / 30
swift-conventions-highlight.md 11/27/2019
Not Preferred:
Not Preferred:
16. Extras
16.1 Musts
Preferred
Not Preferred
15 / 30
swift-conventions-highlight.md 11/27/2019
Preferred
Swiftier Preferred
Not Preferred
16.1.2 Optionals
Force Unwrapping
Preferred unwrap
UIApplication.shared.open(url)
UIApplication.shared.open(url)
Preferred downcast
16 / 30
swift-conventions-highlight.md 11/27/2019
detailViewController.person = person
delegate?.didSelectItem(item)
Preferred
if
let id = jsonObject[Constants.Id] as? Int,
let firstName = jsonObject[Constants.firstName] as? String,
let lastName = jsonObject[Constants.lastName] as? String,
let initials = jsonObject[Constants.initials] as? String {
// Flat
let user = User(id: id, name: name, initials: initials)
// ...
}
Not Preferred
17 / 30
swift-conventions-highlight.md 11/27/2019
Preferred
guard
let constantOne = valueOne,
let constantTwo = valueTwo,
let constantThree = valueThree else {
return
}
if
let constantOne = valueOne,
let constantTwo = valueTwo,
let constantThree = valueThree {
// Code
}
Not Preferred
18 / 30
swift-conventions-highlight.md 11/27/2019
valueThree else {
return
}
Preferred
guard
let constantOne = valueOne,
let constantTwo = valueTwo,
let constantThree = valueThree,
var variableOne = valueFour,
var variableTwo = valueFive,
var variableThree = valueSix else {
return
}
if
let constantOne = valueOne,
let constantTwo = valueTwo,
let constantThree = valueThree,
var variableOne = valueFour,
var variableTwo = valueFive,
var variableThree = valueSix {
// Code
}
Not Preferred
guard let
constantOne = valueOne,
var variableOne = valueTwo,
let constantTwo = valueThree else {
return
}
19 / 30
swift-conventions-highlight.md 11/27/2019
Forced-try Expression
Preferred
do {
let json = try JSONSerialization.jsonObject(with: data, options:
.allowFragments)
print(json)
} catch {
print(error)
}
Not Preferred
// This will crash at runtime if there is an error parsing the JSON data!
let json = try! JSONSerialization.jsonObject(with: data, options:
.allowFragments)
print(json)
Preferred
import Foundation
struct Baz {
...
Not Preferred
import Foundation
struct Baz {
...
Preferred
20 / 30
swift-conventions-highlight.md 11/27/2019
if someParam > 10 {
...
} else {
...
}
}
}
Not Preferred
else {
...
} } }
16.1.5 Protocols
Protocol Conformance
Preferred
// MARK: - UITableViewDataSource
21 / 30
swift-conventions-highlight.md 11/27/2019
// MARK: - UIScrollViewDelegate
extension MyViewcontroller: UIScrollViewDelegate {
// Scroll view delegate methods
}
Not Preferred
Preferred
Not Preferred
Trailing Comma
Not Preferred
let anArray = [
object1,
object2,
object3 //no trailing comma
]
let aDictionary = ["key1": value1, "key2": value2] //how can you even read
that?!
22 / 30
swift-conventions-highlight.md 11/27/2019
Preferred
let anArray = [
object1,
object2,
object3,
]
let aDictionary = [
"key1": value1,
"key2": value2,
]
Preferred
if user.isCurrent?.boolValue == true {
// isCurrent is true
} else {
// isCurrent is nil or false
}
Not Preferred
if user.isCurrent?.boolValue ?? false {
// isCurrent is true
} else {
// isCurrent is nil or false
}
Preferred
enum AnEnum {
case foo
case bar(String)
case baz
}
switch anEnumInstanceWithAssociatedValue {
case .foo: print("Foo")
23 / 30
swift-conventions-highlight.md 11/27/2019
// Correct
case .bar(let barValue): print(barValue) // "hello"
case .baz: print("Baz")
}
Not Preferred
enum AnEnum {
case foo
case bar(String)
case baz
}
switch anEnumInstanceWithAssociatedValue {
case .foo: print("Foo")
// Not Preferred
case let .bar(barValue): print(barValue) // "hello"
case .baz: print("Baz")
}
Preferred
Not Preferred
16.2 Shoulds
Preferred
Not Preferred
16.2.2 Optionals
Preferred
Not Preferred
25 / 30
swift-conventions-highlight.md 11/27/2019
16.2.3 Spacing
Preferred
return nums
.map { $0 * 2 }
.filter { $0 % 2 == 0 }
.reduce(0, +)
}
Not Preferred
26 / 30
swift-conventions-highlight.md 11/27/2019
}
// Flat
UIApplication.shared.open(url)
}
guard
let constantOne = valueOne,
let constantTwo = valueTwo,
let constantThree = valueThree else { return }
guard
let constantOne = valueOne,
let constantTwo = valueTwo,
let constantThree = valueThree
else { return }
Not Preferred
Preferred
27 / 30
swift-conventions-highlight.md 11/27/2019
switch something {
case .oneLongCase,
.anotherLongCase,
.thereAreMoreCases,
.thisIsInASanerPlace:
return false
case .sanity:
return true
}
Not Preferred
switch something {
case .oneLongCase, .anotherLongCase, .thereAreMoreCases,
.thisIsWayTooFarToTheRight:
return true
case .sanity:
return false
}
16.2.4 Loops
Recommended
Discouraged
16.2.5 Closures
Preferred
functionWithAClosure { result in
...
}
28 / 30
swift-conventions-highlight.md 11/27/2019
Not Preferred
functionWithAClosure { (result) in
...
}
Preferred
UserAPI.registerUser(user) { result in
if result.success {
...
}
}
Not Preferred
Preferred
29 / 30
swift-conventions-highlight.md 11/27/2019
Not Preferred
30 / 30