Overview
- An ordered, random-access collection.
- you use the Array type to hold elements of a single type, the array’s Element type. An array can store any kind of elements—from integers to strings to classes.
1. Creating and Initializing an Array
1.1 Creating an Array
- Swift makes it easy to create arrays in your code using an array literal: simply surround a comma separated list of values with square brackets.
- Without any other information, Swift creates an array that includes the specified values, automatically inferring the array’s Element type.
let oddNumbers = [1, 3, 5, 7, 9, 11, 13, 15]
print(oddNumbers)
//prints [1, 3, 5, 7, 9, 11, 13, 15]
let streets = ["Albemarle", "Brandywine", "Chesapeake"]
print(streets)
//prints ["Albemarle", "Brandywine", "Chesapeake"]
1.2 init(repeating:count:)
- Creates a new array containing the specified number of a single, repeated value.
let fiveZs = Array(repeating: "Z", count: 5)
print(fiveZs)
//prints ["Z", "Z", "Z", "Z", "Z"]
1.3 init(_:)
- Creates an array containing the elements of a sequence.
let numbers = Array(1...7)
print(numbers)
//prints [1, 2, 3, 4, 5, 6, 7]
1.4 init()
- Creates a new, empty array.
var emptyArray = Array<Int>()
print(emptyArray.isEmpty)
// Prints "true"
emptyArray = []
print(emptyArray.isEmpty)
// Prints "true"
2. Inspecting an Array
2.1 isEmpty
- A Boolean value indicating whether the collection is empty.
let horseName = "Silver"
if horseName.isEmpty {
print("I've been through the desert on a horse with no name.")
} else {
print("Hi ho, \(horseName)!")
}
// Prints "Hi ho, Silver!")
2.2 count
- The number of elements in the array.
let numbers = Array(1...7)
print("Count of number array is \(numbers.count)")
//prints Count of number array is 7
2.3 capacity
- The total number of elements that the array can contain without allocating new storage.
let numbers = Array(1...7)
print("Capacity of number array is \(numbers.capacity)")
//prints Capacity of number array is 7
3. Accessing Elements
3.1 subscript(_:)
- Accesses the element at the specified position.
var streetsArray = ["Adams", "Bryant", "Channing", "Douglas", "Evarts"]
streetsArray[1] = "Butler"
print("Subscript 1 is \(streetsArray[1])")
//prints Subscript 1 is Butler
3.2 first
- The first element of the collection.
let numberArray = [10, 20, 30, 40, 50]
if let firstNumber = numberArray.first {
print("FirstNumber is \(firstNumber)")
}
//prints FirstNumber is 10
3.3 last
- The last element of the collection.
if let lastNumber = numberArray.last {
print("Last number in array is \(lastNumber)")
}
//prints Last number in array is 50
3.4 subscript(_:)
- Accesses a contiguous subrange of the array’s elements.
let streetArr = ["Adams", "Bryant", "Channing", "Douglas", "Evarts"]
let streetsSlice = streetArr[2 ..< streetArr.endIndex]
print(streetsSlice)
// prints ["Channing", "Douglas", "Evarts"]
let i = streetsSlice.index(of: "Evarts")print(streetArr[i!])
//prints Evarts
4. Adding Elements
4.1 append(_:)
- Adds a new element at the end of the array.
var numberArray1 = [1, 2, 3, 4, 5]
numberArray1.append(100)
print(numberArray1)
//prints [1, 2, 3, 4, 5, 100]
4.2 append(contentsOf:)
- Adds the elements of a sequence or collection to the end of this collection.
var numbers = [1, 2, 3, 4, 5]
numbers.append(contentsOf: 10...15)
print(numbers)
// Prints "[1, 2, 3, 4, 5, 10, 11, 12, 13, 14, 15]"
4.3 insert(_:at:)
- Inserts a new element at the specified position.
numberArray1.insert(100, at: 3)
numberArray1.insert(200, at: numberArray1.endIndex)
print(numberArray1)
//prints [1, 2, 3, 100, 4, 5, 100, 10, 11, 12, 13, 14, 15, 200]
4.4 insert(contentsOf:at:)
- Inserts the elements of a sequence into the collection at the specified position.
numberArray1.insert(contentsOf: 100...103, at: 3)
print(numberArray1)
//prints [1, 2, 3, 100, 101, 102, 103, 100, 4, 5, 100, 10, 11, 12, 13, 14, 15, 200]
4.5 replaceSubrange(_:with:)
- Replaces a range of elements with the elements in the specified collection.
var nums = [10, 20, 30, 40, 50]
nums.replaceSubrange(1...3, with: repeatElement(1, count: 5))
print(nums)
//prints [10, 1, 1, 1, 1, 1, 50]
4.6 reserveCapacity(_:)
- Reserves enough space to store the specified number of elements.
var values: [Int] = [0, 1, 2, 3]
func addTenQuadratic() {
let newCount = values.count + 10
values.reserveCapacity(newCount)
for n in values.count..<newCount {
values.append(n)
}
}
print(values)
//prints [0, 1, 2, 3]
5. Removing Elements
5.1 remove(at:)
- Removes and returns the element at the specified position.
var measurements: [Double] = [1.1, 1.5, 2.9, 1.2, 1.5, 1.3, 1.2]
let removed = measurements.remove(at: 2)
print(measurements)
//prints [1.1000000000000001, 1.5, 1.2, 1.5, 1.3, 1.2]
5.2 removeFirst(_:)
- Removes the specified number of elements from the beginning of the collection.
var bugs = ["Aphid", "Bumblebee", "Cicada", "Damselfly", "Earwig"]
bugs.removeFirst(3)
print(bugs)
//prints ["Damselfly", "Earwig"]
5.3 removeLast(_:)
- Removes the specified number of elements from the end of the collection.
bugs.removeLast(1)
print(bugs)
//prints ["Damselfly"]
5.4 removeSubrange(_:)
- Removes the elements in the specified subrange from the collection.
var measurements1 = [1.2, 1.5, 2.9, 1.2, 1.5]
measurements1.removeSubrange(1..<4)
print(measurements1)
//prints [1.2, 1.5]
5.5 removeAll())
- Removes all elements from the collection.
measurements1.removeAll()
print(measurements1)
//prints []
6. Finding Elements
6.1 contains(where:)
- Returns a Boolean value indicating whether the sequence contains an element that satisfies the given predicate.
enum HTTPResponse {
case ok
case error(Int)
}
let lastThreeResponses: [HTTPResponse] = [.ok, .ok, .error(404)]
let hadError = lastThreeResponses.contains { element in
if case .error = element {
return true
} else {
return false
}
}
print(hadError)
//prints true
6.2 first(where:)
- Returns the first element of the sequence that satisfies the given predicate.
let numbers1 = [3, 7, 4, -2, 9, -6, 10, 1]
if let firstNegative = numbers1.first(where: { $0 < 0 }) {
print("The first negative number is \(firstNegative).")
}
//prints The first negative number is -2.
6.3 index(of:)
- Returns the first index where the specified value appears in the collection.
var students = ["Ben", "Ivy", "Jordell", "Maxime"]
if let i = students.index(of: "Maxime") {
students[i] = "Max"
}
print(students)
//prints ["Ben", "Ivy", "Jordell", "Max"]
6.4 min()
- Returns the minimum element in the sequence.
let heights = [67.5, 65.7, 64.3, 61.1, 58.5, 60.3, 64.9]
let lowestHeight = heights.min()
print(lowestHeight ?? "none")
//prints 58.5
6.5 min(by:)
- Returns the minimum element in the sequence, using the given predicate as the comparison between elements.
let hues = ["Heliotrope": 296, "Coral": 16, "Aquamarine": 156]
let leastHue = hues.min { a, b in a.value < b.value }
print(leastHue!)
//prints (key: "Coral", value: 16)
6.6 max()
- Returns the maximum element in the sequence.
let greatestHeight = heights.max()
print(greatestHeight!)
//67.5
6.7 max(by:)
- Returns the maximum element in the sequence, using the given predicate as the comparison between elements.
let greatestHue1 = hues.max { a, b in a.value < b.value }
print(greatestHue1!)
//prints (key: "Heliotrope", value: 296)
7. Selecting Elements
7.1 prefix(_:)
- Returns a subsequence, up to the specified maximum length, containing the initial elements of the collection.
let numbersA = [1, 2, 3, 4, 5]
print(numbersA.prefix(2))
//prints [1, 2]
7.2 prefix(through:)
- Returns a subsequence from the start of the collection through the specified position.
let numbersAr = [10, 20, 30, 40, 50, 60]
if let i = numbersAr.index(of: 40) {
print(numbersAr.prefix(through: i))
}
//prints [10, 20, 30, 40]
7.3 suffix(_:)
- Returns a subsequence, up to the given maximum length, containing the final elements of the collection.
let numbersA = [1, 2, 3, 4, 5]
print(numbersA.suffix(2))
//prints [4, 5]
7.4 suffix(from:)
- Returns a subsequence from the specified position to the end of the collection.
let numbersS = [10, 20, 30, 40, 50, 60]
if let i = numbersS.index(of: 40) {
print(numbersS.suffix(from: i))
}
//prints [40, 50, 60]
8. Iterating Over an Array's Elements
8.1 forEach(_:)
- Calls the given closure on each element in the sequence in the same order as a for-in loop.
let numberWords = ["one", "two", "three"]
for word in numberWords {
print(word)
}
//prints one
two
three
8.2 enumerated()
- Returns a sequence of pairs (n, x), where n represents a consecutive integer starting at zero, and x represents an element of the sequence.
for (n, c) in "Swift".enumerated() {
print("\(n): '\(c)'")
}
//prints
0: 'S'
1: 'w'
2: 'i'
3: 'f'
4: 't'
9. Sorting an Array
9.1 sort()
- Sorts the collection in place.
var students1 = ["Kofi", "Abena", "Peter", "Kweku", "Akosua"]
students1.sort()
print(students1)
//prints ["Abena", "Akosua", "Kofi", "Kweku", "Peter"]
9.2 sort(by:)
- Sorts the collection in place, using the given predicate as the comparison between elements.
enum HTTPResponse1 {
case ok
case error(Int)
}
var responses: [HTTPResponse1] = [.error(500), .ok, .ok, .error(404), .error(403)]
responses.sort {
switch ($0, $1) {
// Order errors by code
case let (.error(aCode), .error(bCode)):
return aCode < bCode
// All successes are equivalent, so none is before any other
case (.ok, .ok): return false
// Order errors before successes
case (.error, .ok): return true
case (.ok, .error): return false
}
}
print(responses)
//prints [TempCode.HTTPResponse1.error(403), TempCode.HTTPResponse1.error(404), TempCode.HTTPResponse1.error(500), TempCode.HTTPResponse1.ok, TempCode.HTTPResponse1.ok]
9.3 sorted()
- Returns the elements of the collection, sorted.
let studentsT: Set = ["Kofi", "Abena", "Peter", "Kweku", "Akosua"]
let sortedStudents = studentsT.sorted()
print(sortedStudents)
//prints ["Abena", "Akosua", "Kofi", "Kweku", "Peter"]
9.4 reversed()
- Returns a view presenting the elements of the collection in reverse order.
let numbersC = [3, 5, 7]
for number in numbersC.reversed() {
print(number)
//prints 7
5
3
10. Excluding Elements
10.1 dropFirst()
- Returns a subsequence containing all but the first element of the sequence.
let numbersW = [1, 2, 3, 4, 5]
print(numbersW.dropFirst())
//prints [2, 3, 4, 5]
10.2 dropLast()
- Returns a subsequence containing all but the last element of the sequence.
let numbersW = [1, 2, 3, 4, 5]
print(numbersW.dropLast())
//prints [1, 2, 3, 4]
11. Manipulating Indices
11.1 startIndex
- The position of the first element in a nonempty array.
print(numbersW.startIndex)
//prints 0
11.2 endIndex
- The array’s “past the end” position—that is, the position one greater than the last valid subscript argument.
print(numbersW.endIndex)
//prints 5
12. Splitting and Joining Elements
12.1 split(separator:maxSplits:omittingEmptySubsequences:)
- Returns the longest possible subsequences of the sequence, in order, around elements equal to the given element.
let line = "BLANCHE: I don't want realism. I want magic!"
print(line.split(separator: " ") .map(String.init))
//prints ["BLANCHE:", "I", "don\'t", "want", "realism.", "I", "want", "magic!"]
12.2 split(maxSplits:omittingEmptySubsequences:whereSeparator:)
- Returns the longest possible subsequences of the collection, in order, that don’t contain elements satisfying the given predicate.
print(line.split(whereSeparator: { $0 == "a" }))
//prints ["BLANCHE: I don\'t w", "nt re", "lism. I w", "nt m", "gic!"]
12.3 joined(separator:)
- Returns a new string by concatenating the elements of the sequence, adding the given separator between each element.
let cast = ["Vivien", "Marlon", "Kim", "Karl"]
let list = cast.joined(separator: ", ")
print(list)
//prints Vivien, Marlon, Kim, Karl
12.4 joined()
- Returns the elements of this collection of collections, concatenated.
let ranges = [0..<3, 8..<10, 15..<17]
for range in ranges {
print(range)
}
// Prints "0..<3"
// Prints "8..<10"
// Prints "15..<17"
for index in ranges.joined() {
print(index, terminator: " ")
}
// Prints: "0 1 2 8 9 15 16"
13. Comparing Arrays
13.1 ==(_: _:)
- Returns true if these arrays contain the same elements.
let arr1 = [1, 2, 2, 3, 4, 5]
let arr2 = [1, 3, 6, 7, 9 ,10]
if (arr1 == arr2){
print("EQUAL ARRAY\(arr1)")
}else{
print("NOT EQUAL")
}
//prints NOT EQUAL
13.2 !=(::)
- Returns true if the arrays do not contain the same elements.
let arr1 = [1, 2, 2, 3, 4, 5]
let arr2 = [1, 3, 6, 7, 9 ,10]
if (arr1 != arr2){
print("Not EQUAL")
}else{
print("EQUAL")
}
//prints Not EQUAL
13.3 elementsEqual(_:)
- Returns a Boolean value indicating whether this sequence and another sequence contain the same elements in the same order.
if (arr1.elementsEqual(arr2)){
print("equal elements")
}else{
print("Not equal")
}
//prints Not equal
13.4 starts(with:)
- Returns a Boolean value indicating whether the initial elements of the sequence are the same as the elements in another sequence.
let a = 1...3
let b = 1...10
print(b.starts(with: a))
//prints true
13.5 lexicographicallyPrecedes(_:)
- Returns a Boolean value indicating whether the sequence precedes another sequence in a lexicographical (dictionary) ordering, using the less-than operator (<) to compare elements.
let a = [1, 2, 2, 2]
let b = [1, 2, 3, 4]
print(a.lexicographicallyPrecedes(b))
// Prints "true"
print(b.lexicographicallyPrecedes(b))
// Prints "false"
14. Describing an Array
14.1 description
- A textual representation of the array and its elements.
let ax = [1, 2, 2, 2]
print(ax.description)
//prints [1, 2, 2, 2]
14.2 debugDescription
- A textual representation of the array and its elements, suitable for debugging.
let ax = [1, 2, 2, 2]
print(ax.debugDescription)
//prints [1, 2, 2, 2]
14.3 customMirror
- A mirror that reflects the array.
let ax = [1, 2, 2, 2]
print(ax.customMirror)
//prints Mirror for Array<Int>
15. Bridging Between Array and NSArray
-
When you need to access APIs that require data in an NSArray instance instead of Array, use the type-cast operator (as) to bridge your instance.
-
For bridging to be possible, the Element type of your array must be a class, an @objc protocol (a protocol imported from Objective-C or marked with the @objc attribute), or a type that bridges to a Foundation type.
import Foundation
var arr : NSMutableArray = ["Pencil", "Eraser", "Notebook"]
func bar (a : NSMutableArray)
{
a[2] = "Pen"
}
bar(a : arr)
print (Array(arr))
//prints ["Pencil", "Eraser", "Pen"]
Next - Set by Example