Swift Notes
Include numbers in text
let apples = 3
let appleSummary = "I have \(apples) apples."
Optionals
An optional value either contains a value or contains nil to indicate that the value is missing. Optionals are denoted by a ? after a variables type.
var optionalName: String?
var greeting = "Hello!"
if let name = optionalName {
greeting = "Hello, \(name)"
}
If the optional value is nil, the conditional is false and the code in braces is skipped. Otherwise, the optional value is unwrapped and assigned to the constant after let, which makes the unwrapped value available inside the block of code.
Use ?? for default values
let nickName: String? = nil
let fullName: String = "John Appleseed"
let informalGreeting = "Hi \(nickName ?? fullName)"
Tuples
let violet = ("#EE82EE", 230, 130, 238
print("Violet is \(violet.0)")
let (hex, red, green, blue) = violet
print("Violet is \(hex)")
Dictionaries
let elements = [
["title": "Color",
"description": "some stuff about color",
"image": "color"
],
["title": "Diagram",
"description": "some stuff about diagram",
"image": "diagram"
],
]
Ranges
let rangesInfinite = 1... // Infinite values
rangesInfinite.contains(3) // true
rangesInfinite.contains(569999) // true
rangesInfinite.contains(0) // false
let numbers = [1,2,3,4,5,6,7,8,9,10]
numbers[..<5]
Loops
Use ..< or ... to create a range
var total = 0
for i in 0..<4 {
total += i
}
print(total)
Functions
Nested Functions have access to variables declared in the outer function
A function can take another function as an argument
func hasAnyMatches(list: [Int], condition: (Int) -> Bool) -> Bool {
for item in list {
if condition(item) {
return true
}
}
return false
}
func lessThanTen(number: Int) -> Bool {
return number < 10
}
var numbers = [20, 19, 7, 12]
hasAnyMatches(list: numbers, condition: lessThanTen)
Functions are actually a kind of closure (blocks of code that can be called later). The code in a closure has access to things like variables and functions that were available in the scope where the closure was created, even if the closure is in a different scope when it is executed. A closure is denoted by braces {}. The in keyword is kinda like the => in JS
numbers = [1, 2, 3, 4]
numbers.map({ (number: Int) -> Int in
let result = 3 * number
return result
})
When types of clusures are already known, you can omit them
let mappedNumbers = numbers.map({ number in 3 * number })
Closure parameters can be refered to by number
let sortedNumbers = numbers.sorted { $0 > $1 }