Last active
February 27, 2019 11:57
-
-
Save cyyeh/baefd6f5713c7aeb1b7066e871b3b8d1 to your computer and use it in GitHub Desktop.
Swift Collection Types
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /* | |
| Referenced from Stanford CS193p | |
| #: important | |
| ##: very important | |
| Collection Types | |
| - #Mutability of Collections | |
| - #Arrays | |
| - Sets | |
| - Performing Set Operations | |
| - #Dictionaries | |
| Reference: https://docs.swift.org/swift-book/LanguageGuide/CollectionTypes.html | |
| */ | |
| /* | |
| #Mutability of Collections | |
| */ | |
| // If you create an array, a set, or a dictionary, and assign it to a variable, the collection that is created will be mutable. This means that you can change (or mutate) the collection after itโs created by adding, removing, or changing items in the collection. If you assign an array, a set, or a dictionary to a constant, that collection is immutable, and its size and contents cannot be changed | |
| /* | |
| #Arrays | |
| */ | |
| // Array Type Shorthand Syntax | |
| // Array<Element> | |
| // [Element] -> preferred | |
| // Creating an Empty Array | |
| var someInts = [Int]() | |
| print("someInts is of type [Int] with \(someInts.count) items.") | |
| // Prints "someInts is of type [Int] with 0 items." | |
| someInts.append(3) | |
| // someInts now contains 1 value of type Int | |
| someInts = [] | |
| // someInts is now an empty array, but is still of type [Int] | |
| // Creating an Array with a Default Value | |
| var threeDoubles = Array(repeating: 0.0, count: 3) | |
| // threeDoubles is of type [Double], and equals [0.0, 0.0, 0.0] | |
| // Creating an Array by Adding Two Arrays Together | |
| var anotherThreeDoubles = Array(repeating: 2.5, count: 3) | |
| // anotherThreeDoubles is of type [Double], and equals [2.5, 2.5, 2.5] | |
| var sixDoubles = threeDoubles + anotherThreeDoubles | |
| // sixDoubles is inferred as [Double], and equals [0.0, 0.0, 0.0, 2.5, 2.5, 2.5] | |
| // Creating an Array with an Array Literal | |
| var shoppingList = ["Eggs", "Milk"] | |
| // shoppingList has been initialized with two initial items | |
| // Accessing and Modifying an Array | |
| print("The shopping list contains \(shoppingList.count) items.") | |
| // Prints "The shopping list contains 2 items." | |
| if shoppingList.isEmpty { | |
| print("The shopping list is empty.") | |
| } else { | |
| print("The shopping list is not empty.") | |
| } | |
| // Prints "The shopping list is not empty." | |
| shoppingList.append("Flour") | |
| // shoppingList now contains 3 items, and someone is making pancakes | |
| shoppingList += ["Chocolate Spread", "Cheese", "Butter"] | |
| // shoppingList now contains 7 items | |
| var firstItem = shoppingList[0] | |
| // firstItem is equal to "Eggs" | |
| shoppingList[2...4] = ["Bananas", "Apples"] | |
| // shoppingList now contains 6 items | |
| shoppingList.insert("Maple Syrup", at: 0) | |
| // shoppingList now contains 7 items | |
| // "Maple Syrup" is now the first item in the list | |
| let mapleSyrup = shoppingList.remove(at: 2) | |
| // the item that was at index 0 has just been removed | |
| // shoppingList now contains 6 items, and no Maple Syrup | |
| // the mapleSyrup constant is now equal to the removed "Maple Syrup" string | |
| let apples = shoppingList.removeLast() | |
| // the last item in the array has just been removed | |
| // shoppingList now contains 5 items, and no apples | |
| // the apples constant is now equal to the removed "Apples" string | |
| // Iterating Over an Array | |
| for item in shoppingList { | |
| print(item) | |
| } | |
| for (index, value) in shoppingList.enumerated() { | |
| print("Item \(index + 1): \(value)") | |
| } | |
| /* | |
| Sets | |
| */ | |
| // Hash Values for Set Types | |
| // All of Swiftโs basic types (such as String, Int, Double, and Bool) are hashable by default, and can be used as set value types or dictionary key types. Enumeration case values without associated values (as described in Enumeration) are also hashable by default. | |
| // Set Type Syntax | |
| // Set<Element> | |
| // Unlike arrays and dictionaries, sets do not have an equivalent shorthand form | |
| // Creating and Initializing an Empty Set | |
| var letters = Set<Character>() | |
| print("letters is of type Set<Character> with \(letters.count) items.") | |
| // Prints "letters is of type Set<Character> with 0 items." | |
| letters.insert("a") | |
| // letters now contains 1 value of type Character | |
| letters = [] | |
| // letters is now an empty set, but is still of type Set<Character> | |
| // Creating a Set with an Array Literal | |
| var favoriteGenres: Set = ["Rock", "Classical", "Hip hop"] | |
| // favoriteGenres has been initialized with three initial items | |
| // Accessing and Modifying a Set | |
| print("I have \(favoriteGenres.count) favorite music genres.") | |
| // Prints "I have 3 favorite music genres." | |
| if favoriteGenres.isEmpty { | |
| print("As far as music goes, I'm not picky.") | |
| } else { | |
| print("I have particular music preferences.") | |
| } | |
| // Prints "I have particular music preferences." | |
| favoriteGenres.insert("Jazz") | |
| // favoriteGenres now contains 4 items | |
| if let removedGenre = favoriteGenres.remove("Rock") { | |
| print("\(removedGenre)? I'm over it.") | |
| } else { | |
| print("I never much cared for that.") | |
| } | |
| // Prints "Rock? I'm over it." | |
| if favoriteGenres.contains("Funk") { | |
| print("I get up on the good foot.") | |
| } else { | |
| print("It's too funky in here.") | |
| } | |
| // Prints "It's too funky in here." | |
| // Iterating Over a Set | |
| for genre in favoriteGenres { | |
| print("\(genre)") | |
| } | |
| for genre in favoriteGenres.sorted() { | |
| print("\(genre)") | |
| } | |
| /* | |
| Performing Set Operations | |
| */ | |
| // Fundamental Set Operations | |
| let oddDigits: Set = [1, 3, 5, 7, 9] | |
| let evenDigits: Set = [0, 2, 4, 6, 8] | |
| let singleDigitPrimeNumbers: Set = [2, 3, 5, 7] | |
| oddDigits.union(evenDigits).sorted() | |
| // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] | |
| oddDigits.intersection(evenDigits).sorted() | |
| // [] | |
| oddDigits.subtracting(singleDigitPrimeNumbers).sorted() | |
| // [1, 9] | |
| oddDigits.symmetricDifference(singleDigitPrimeNumbers).sorted() | |
| // Set Membership and Equality | |
| let houseAnimals: Set = ["๐ถ", "๐ฑ"] | |
| let farmAnimals: Set = ["๐ฎ", "๐", "๐", "๐ถ", "๐ฑ"] | |
| let cityAnimals: Set = ["๐ฆ", "๐ญ"] | |
| houseAnimals.isSubset(of: farmAnimals) | |
| // true | |
| farmAnimals.isSuperset(of: houseAnimals) | |
| // true | |
| farmAnimals.isDisjoint(with: cityAnimals) | |
| // true | |
| /* | |
| #Dictionaries | |
| */ | |
| // Dictionary Type Shorthand Syntax | |
| // Dictionary<Key, Value> | |
| // [Key: Value] -> preferred | |
| // Creating an Empty Dictionary | |
| var namesOfIntegers = [Int: String]() | |
| // namesOfIntegers is an empty [Int: String] dictionary | |
| namesOfIntegers[16] = "sixteen" | |
| // namesOfIntegers now contains 1 key-value pair | |
| namesOfIntegers = [:] | |
| // namesOfIntegers is once again an empty dictionary of type [Int: String] | |
| // Creating a Dictionary with a Dictionary Literal | |
| var airports = ["YYZ": "Toronto Pearson", "DUB": "Dublin"] | |
| // Accessing and Modifying a Dictionary | |
| print("The airports dictionary contains \(airports.count) items.") | |
| // Prints "The airports dictionary contains 2 items." | |
| if airports.isEmpty { | |
| print("The airports dictionary is empty.") | |
| } else { | |
| print("The airports dictionary is not empty.") | |
| } | |
| // Prints "The airports dictionary is not empty." | |
| airports["LHR"] = "London" | |
| // the airports dictionary now contains 3 items | |
| if let oldValue = airports.updateValue("Dublin Airport", forKey: "DUB") { | |
| print("The old value for DUB was \(oldValue).") | |
| } | |
| // Prints "The old value for DUB was Dublin." | |
| if let airportName = airports["DUB"] { | |
| print("The name of the airport is \(airportName).") | |
| } else { | |
| print("That airport is not in the airports dictionary.") | |
| } | |
| // Prints "The name of the airport is Dublin Airport." | |
| airports["APL"] = nil | |
| // APL has now been removed from the dictionary | |
| if let removedValue = airports.removeValue(forKey: "DUB") { | |
| print("The removed airport's name is \(removedValue).") | |
| } else { | |
| print("The airports dictionary does not contain a value for DUB.") | |
| } | |
| // Prints "The removed airport's name is Dublin Airport." | |
| // Iterating Over a Dictionary | |
| for (airportCode, airportName) in airports { | |
| print("\(airportCode): \(airportName)") | |
| } | |
| // YYZ: Toronto Pearson | |
| // LHR: London Heathrow | |
| for airportCode in airports.keys { | |
| print("Airport code: \(airportCode)") | |
| } | |
| // Airport code: YYZ | |
| // Airport code: LHR | |
| for airportName in airports.values { | |
| print("Airport name: \(airportName)") | |
| } | |
| // Airport name: Toronto Pearson | |
| // Airport name: London Heathrow | |
| let airportCodes = [String](airports.keys) | |
| // airportCodes is ["YYZ", "LHR"] | |
| let airportNames = [String](airports.values) | |
| // airportNames is ["Toronto Pearson", "London Heathrow"] | |
| // To iterate over the keys or values of a dictionary in a specific order, use the sorted() method on its keys or values property. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment