From c5b4907dd75d2b610401f6787a39e5000d6f56e6 Mon Sep 17 00:00:00 2001 From: Juan Antonio Karmy Date: Sat, 9 Jul 2016 17:33:06 -0400 Subject: [PATCH] Upgraded book to Swift 3.0 --- .../UserInterfaceState.xcuserstate | Bin 7721 -> 7729 bytes .../UserInterfaceState.xcuserstate | Bin 8422 -> 8424 bytes 02_Basic Operators.playground/section-1.swift | 2 +- .../contents.xcworkspacedata | 7 - .../UserInterfaceState.xcuserstate | Bin 8610 -> 0 bytes .../UserInterfaceState.xcuserstate | Bin 7700 -> 0 bytes .../contents.xcplayground | 0 .../section-1.swift | 10 +- .../contents.xcworkspacedata | 7 - .../UserInterfaceState.xcuserstate | Bin 8404 -> 0 bytes .../UserInterfaceState.xcuserstate | Bin 6846 -> 0 bytes .../contents.xcplayground | 0 .../section-1.swift | 1 - .../contents.xcworkspacedata | 7 - .../UserInterfaceState.xcuserstate | Bin 8378 -> 0 bytes .../UserInterfaceState.xcuserstate | Bin 7064 -> 0 bytes 05_Functions.playground/section-1.swift.orig | 162 -------- .../contents.xcworkspacedata | 7 - .../UserInterfaceState.xcuserstate | Bin 8643 -> 0 bytes .../UserInterfaceState.xcuserstate | Bin 7055 -> 0 bytes .../contents.xcplayground | 0 .../section-1.swift | 10 +- .../contents.xcplayground | 0 .../section-1.swift | 43 ++- .../contents.xcworkspacedata | 7 - .../UserInterfaceState.xcuserstate | Bin 8402 -> 0 bytes .../UserInterfaceState.xcuserstate | Bin 6975 -> 0 bytes .../contents.xcworkspacedata | 7 - .../UserInterfaceState.xcuserstate | Bin 8436 -> 0 bytes .../contents.xcplayground | 0 .../section-1.swift | 0 .../contents.xcplayground | 0 .../section-1.swift | 0 .../contents.xcworkspacedata | 7 - .../UserInterfaceState.xcuserstate | Bin 8558 -> 0 bytes .../UserInterfaceState.xcuserstate | Bin 7073 -> 0 bytes .../contents.xcworkspacedata | 7 - .../UserInterfaceState.xcuserstate | Bin 8537 -> 0 bytes .../UserInterfaceState.xcuserstate | Bin 6817 -> 0 bytes .../contents.xcplayground | 0 .../section-1.swift | 0 .../contents.xcplayground | 0 .../section-1.swift | 0 .../contents.xcworkspacedata | 7 - .../UserInterfaceState.xcuserstate | Bin 8558 -> 0 bytes .../contents.xcworkspacedata | 7 - .../UserInterfaceState.xcuserstate | Bin 8390 -> 0 bytes .../contents.xcplayground | 0 .../section-1.swift | 6 +- .../contents.xcplayground | 0 .../section-1.swift | 0 .../contents.xcworkspacedata | 7 - .../UserInterfaceState.xcuserstate | Bin 8414 -> 0 bytes .../Contents.swift.orig | 78 ---- .../contents.xcworkspacedata | 7 - .../UserInterfaceState.xcuserstate | Bin 8420 -> 0 bytes .../UserInterfaceState.xcuserstate | Bin 7119 -> 0 bytes .../contents.xcplayground | 0 .../section-1.swift | 0 15_ARC.playground/Contents.swift | 269 -------------- .../contents.xcworkspacedata | 7 - .../UserInterfaceState.xcuserstate | Bin 12990 -> 0 bytes .../Contents.swift | 26 +- .../contents.xcplayground | 0 16_ARC.playground/Contents.swift | 269 ++++++++++++++ .../contents.xcplayground | 0 .../contents.xcworkspacedata | 7 - .../UserInterfaceState.xcuserstate | Bin 13730 -> 0 bytes .../UserInterfaceState.xcuserstate | Bin 7132 -> 0 bytes 17_Error_Handling.playground/Contents.swift | 221 ----------- .../Contents.swift.orig | 225 ------------ .../contents.xcworkspacedata | 7 - .../UserInterfaceState.xcuserstate | Bin 14580 -> 0 bytes .../UserInterfaceState.xcuserstate | Bin 7165 -> 0 bytes .../Contents.swift | 108 +++--- .../contents.xcplayground | 0 18_Error_Handling.playground/Contents.swift | 221 +++++++++++ .../contents.xcplayground | 0 .../Contents.swift | 197 ---------- .../contents.xcworkspacedata | 7 - .../UserInterfaceState.xcuserstate | Bin 15810 -> 0 bytes .../UserInterfaceState.xcuserstate | Bin 7170 -> 0 bytes .../Contents.swift | 197 ++++++++++ .../contents.xcplayground | 0 20_Extensions.playground/Contents.swift.orig | 201 ---------- .../contents.xcworkspacedata | 7 - .../UserInterfaceState.xcuserstate | Bin 16066 -> 0 bytes .../UserInterfaceState.xcuserstate | Bin 7249 -> 0 bytes .../Contents.swift | 108 +++--- .../contents.xcplayground | 0 .../contents.xcworkspacedata | 7 - .../UserInterfaceState.xcuserstate | Bin 16739 -> 0 bytes .../UserInterfaceState.xcuserstate | Bin 7133 -> 0 bytes 22_Generics.playground/Contents.swift | 248 ------------- .../contents.xcworkspacedata | 7 - .../UserInterfaceState.xcuserstate | Bin 17091 -> 0 bytes .../timeline.xctimeline | 6 - .../contents.xcworkspacedata | 7 - .../UserInterfaceState.xcuserstate | Bin 17410 -> 0 bytes .../Contents.swift | 346 +++++++++--------- .../contents.xcplayground | 0 .../contents.xcworkspacedata | 7 - .../UserInterfaceState.xcuserstate | Bin 17091 -> 0 bytes .../timeline.xctimeline | 6 - .../contents.xcworkspacedata | 7 - .../UserInterfaceState.xcuserstate | Bin 18127 -> 0 bytes .../UserInterfaceState.xcuserstate | Bin 7047 -> 0 bytes 23_Generics.playground/Contents.swift | 248 +++++++++++++ .../21_Protocols.playground/Contents.swift | 0 .../contents.xcplayground | 0 .../contents.xcplayground | 0 .../Contents.swift | 12 +- .../21_Protocols.playground/Contents.swift | 0 .../contents.xcplayground | 0 .../contents.xcplayground | 0 .../contents.xcworkspacedata | 7 - .../UserInterfaceState.xcuserstate | Bin 8287 -> 0 bytes .../Contents.swift | 32 +- .../contents.xcplayground | 0 119 files changed, 1308 insertions(+), 2105 deletions(-) delete mode 100644 03_Collection Types.playground/playground.xcworkspace/contents.xcworkspacedata delete mode 100644 03_Collection Types.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 03_Collection Types.playground/playground.xcworkspace/xcuserdata/nhat.tien.xcuserdatad/UserInterfaceState.xcuserstate rename {03_Collection Types.playground => 04_Collection Types.playground}/contents.xcplayground (100%) rename {03_Collection Types.playground => 04_Collection Types.playground}/section-1.swift (90%) delete mode 100644 04_Control Flow.playground/playground.xcworkspace/contents.xcworkspacedata delete mode 100644 04_Control Flow.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 04_Control Flow.playground/playground.xcworkspace/xcuserdata/nhat.tien.xcuserdatad/UserInterfaceState.xcuserstate rename {04_Control Flow.playground => 05_Control Flow.playground}/contents.xcplayground (100%) rename {04_Control Flow.playground => 05_Control Flow.playground}/section-1.swift (99%) delete mode 100644 05_Functions.playground/playground.xcworkspace/contents.xcworkspacedata delete mode 100644 05_Functions.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 05_Functions.playground/playground.xcworkspace/xcuserdata/nhat.tien.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 05_Functions.playground/section-1.swift.orig delete mode 100644 06_Closures.playground/playground.xcworkspace/contents.xcworkspacedata delete mode 100644 06_Closures.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 06_Closures.playground/playground.xcworkspace/xcuserdata/nhat.tien.xcuserdatad/UserInterfaceState.xcuserstate rename {05_Functions.playground => 06_Functions.playground}/contents.xcplayground (100%) rename {05_Functions.playground => 06_Functions.playground}/section-1.swift (93%) rename {06_Closures.playground => 07_Closures.playground}/contents.xcplayground (100%) rename {06_Closures.playground => 07_Closures.playground}/section-1.swift (57%) delete mode 100644 07_Enumerations.playground/playground.xcworkspace/contents.xcworkspacedata delete mode 100644 07_Enumerations.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 07_Enumerations.playground/playground.xcworkspace/xcuserdata/nhat.tien.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 08_Classes & Structs.playground/playground.xcworkspace/contents.xcworkspacedata delete mode 100644 08_Classes & Structs.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate rename {07_Enumerations.playground => 08_Enumerations.playground}/contents.xcplayground (100%) rename {07_Enumerations.playground => 08_Enumerations.playground}/section-1.swift (100%) rename {08_Classes & Structs.playground => 09_Classes & Structs.playground}/contents.xcplayground (100%) rename {08_Classes & Structs.playground => 09_Classes & Structs.playground}/section-1.swift (100%) delete mode 100644 09_Properties.playground/playground.xcworkspace/contents.xcworkspacedata delete mode 100644 09_Properties.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 09_Properties.playground/playground.xcworkspace/xcuserdata/nhat.tien.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 10_Methods.playground/playground.xcworkspace/contents.xcworkspacedata delete mode 100644 10_Methods.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 10_Methods.playground/playground.xcworkspace/xcuserdata/nhat.tien.xcuserdatad/UserInterfaceState.xcuserstate rename {09_Properties.playground => 10_Properties.playground}/contents.xcplayground (100%) rename {09_Properties.playground => 10_Properties.playground}/section-1.swift (100%) rename {10_Methods.playground => 11_Methods.playground}/contents.xcplayground (100%) rename {10_Methods.playground => 11_Methods.playground}/section-1.swift (100%) delete mode 100644 11_Subscripts.playground/playground.xcworkspace/contents.xcworkspacedata delete mode 100644 11_Subscripts.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 12_Inheritance.playground/playground.xcworkspace/contents.xcworkspacedata delete mode 100644 12_Inheritance.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate rename {11_Subscripts.playground => 12_Subscripts.playground}/contents.xcplayground (100%) rename {11_Subscripts.playground => 12_Subscripts.playground}/section-1.swift (88%) rename {12_Inheritance.playground => 13_Inheritance.playground}/contents.xcplayground (100%) rename {12_Inheritance.playground => 13_Inheritance.playground}/section-1.swift (100%) delete mode 100644 13_Initialization.playground/playground.xcworkspace/contents.xcworkspacedata delete mode 100644 13_Initialization.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 14_Deinitialization.playground/Contents.swift.orig delete mode 100644 14_Deinitialization.playground/playground.xcworkspace/contents.xcworkspacedata delete mode 100644 14_Deinitialization.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 14_Deinitialization.playground/playground.xcworkspace/xcuserdata/nhat.tien.xcuserdatad/UserInterfaceState.xcuserstate rename {13_Initialization.playground => 14_Initialization.playground}/contents.xcplayground (100%) rename {13_Initialization.playground => 14_Initialization.playground}/section-1.swift (100%) delete mode 100644 15_ARC.playground/Contents.swift delete mode 100644 15_ARC.playground/playground.xcworkspace/contents.xcworkspacedata delete mode 100644 15_ARC.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate rename {14_Deinitialization.playground => 15_Deinitialization.playground}/Contents.swift (69%) rename {14_Deinitialization.playground => 15_Deinitialization.playground}/contents.xcplayground (100%) create mode 100644 16_ARC.playground/Contents.swift rename {15_ARC.playground => 16_ARC.playground}/contents.xcplayground (100%) delete mode 100644 16_Optional Chaining.playground/playground.xcworkspace/contents.xcworkspacedata delete mode 100644 16_Optional Chaining.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 16_Optional Chaining.playground/playground.xcworkspace/xcuserdata/nhat.tien.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 17_Error_Handling.playground/Contents.swift delete mode 100644 17_Error_Handling.playground/Contents.swift.orig delete mode 100644 17_Error_Handling.playground/playground.xcworkspace/contents.xcworkspacedata delete mode 100644 17_Error_Handling.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 17_Error_Handling.playground/playground.xcworkspace/xcuserdata/nhat.tien.xcuserdatad/UserInterfaceState.xcuserstate rename {16_Optional Chaining.playground => 17_Optional Chaining.playground}/Contents.swift (60%) rename {16_Optional Chaining.playground => 17_Optional Chaining.playground}/contents.xcplayground (100%) create mode 100644 18_Error_Handling.playground/Contents.swift rename {17_Error_Handling.playground => 18_Error_Handling.playground}/contents.xcplayground (100%) delete mode 100644 18_Type Casting copy.playground/Contents.swift delete mode 100644 18_Type Casting copy.playground/playground.xcworkspace/contents.xcworkspacedata delete mode 100644 18_Type Casting copy.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 18_Type Casting copy.playground/playground.xcworkspace/xcuserdata/nhat.tien.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 19_Type Casting copy.playground/Contents.swift rename {18_Type Casting copy.playground => 19_Type Casting copy.playground}/contents.xcplayground (100%) delete mode 100644 20_Extensions.playground/Contents.swift.orig delete mode 100644 20_Extensions.playground/playground.xcworkspace/contents.xcworkspacedata delete mode 100644 20_Extensions.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 20_Extensions.playground/playground.xcworkspace/xcuserdata/nhat.tien.xcuserdatad/UserInterfaceState.xcuserstate rename {20_Extensions.playground => 21_Extensions.playground}/Contents.swift (52%) rename {20_Extensions.playground => 21_Extensions.playground}/contents.xcplayground (100%) delete mode 100644 21_Protocols.playground/playground.xcworkspace/contents.xcworkspacedata delete mode 100644 21_Protocols.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 21_Protocols.playground/playground.xcworkspace/xcuserdata/nhat.tien.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 22_Generics.playground/Contents.swift delete mode 100644 22_Generics.playground/Resources/21_Protocols.playground/playground.xcworkspace/contents.xcworkspacedata delete mode 100644 22_Generics.playground/Resources/21_Protocols.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 22_Generics.playground/Resources/21_Protocols.playground/timeline.xctimeline delete mode 100644 22_Generics.playground/playground.xcworkspace/contents.xcworkspacedata delete mode 100644 22_Generics.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate rename {21_Protocols.playground => 22_Protocols.playground}/Contents.swift (50%) rename {21_Protocols.playground => 22_Protocols.playground}/contents.xcplayground (100%) delete mode 100644 23_Access Control.playground/Resources/21_Protocols.playground/playground.xcworkspace/contents.xcworkspacedata delete mode 100644 23_Access Control.playground/Resources/21_Protocols.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 23_Access Control.playground/Resources/21_Protocols.playground/timeline.xctimeline delete mode 100644 23_Access Control.playground/playground.xcworkspace/contents.xcworkspacedata delete mode 100644 23_Access Control.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 23_Access Control.playground/playground.xcworkspace/xcuserdata/nhat.tien.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 23_Generics.playground/Contents.swift rename {22_Generics.playground => 23_Generics.playground}/Resources/21_Protocols.playground/Contents.swift (100%) rename {22_Generics.playground => 23_Generics.playground}/Resources/21_Protocols.playground/contents.xcplayground (100%) rename {22_Generics.playground => 23_Generics.playground}/contents.xcplayground (100%) rename {23_Access Control.playground => 24_Access Control.playground}/Contents.swift (99%) rename {23_Access Control.playground => 24_Access Control.playground}/Resources/21_Protocols.playground/Contents.swift (100%) rename {23_Access Control.playground => 24_Access Control.playground}/Resources/21_Protocols.playground/contents.xcplayground (100%) rename {23_Access Control.playground => 24_Access Control.playground}/contents.xcplayground (100%) delete mode 100644 24_Higher Order Functions.playground/playground.xcworkspace/contents.xcworkspacedata delete mode 100644 24_Higher Order Functions.playground/playground.xcworkspace/xcuserdata/nhat.tien.xcuserdatad/UserInterfaceState.xcuserstate rename {24_Higher Order Functions.playground => 25_Higher Order Functions.playground}/Contents.swift (55%) rename {24_Higher Order Functions.playground => 25_Higher Order Functions.playground}/contents.xcplayground (100%) diff --git a/01_The Basics.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate b/01_The Basics.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate index 8c12edf1d5fbb3b1f872d55b5e8c2f581d0b6346..e7893a40205a80d5a6a85dca1b6a0afc70c85982 100644 GIT binary patch delta 4045 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 E1!Zx4EdT%j diff --git a/02_Basic Operators.playground/section-1.swift b/02_Basic Operators.playground/section-1.swift index d5845b0..f6d075d 100644 --- a/02_Basic Operators.playground/section-1.swift +++ b/02_Basic Operators.playground/section-1.swift @@ -48,6 +48,6 @@ for index in 0.. - - - - diff --git a/03_Collection Types.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate b/03_Collection Types.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index 713da5a46949f18f2a8c532e0bd23d37f3e90462..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8610 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 buOxnu_)+5L;qwP5?fd^n`G4eZ;+Ovo#eSh# diff --git a/03_Collection Types.playground/playground.xcworkspace/xcuserdata/nhat.tien.xcuserdatad/UserInterfaceState.xcuserstate b/03_Collection Types.playground/playground.xcworkspace/xcuserdata/nhat.tien.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index 4c939a3cd424a260c5fe1eda1ebae051b7d93616..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7700 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 a;|9lO$GwgRqg549+W*<7e8&DdcK!>49hwyY diff --git a/03_Collection Types.playground/contents.xcplayground b/04_Collection Types.playground/contents.xcplayground similarity index 100% rename from 03_Collection Types.playground/contents.xcplayground rename to 04_Collection Types.playground/contents.xcplayground diff --git a/03_Collection Types.playground/section-1.swift b/04_Collection Types.playground/section-1.swift similarity index 90% rename from 03_Collection Types.playground/section-1.swift rename to 04_Collection Types.playground/section-1.swift index 4efd74c..37c9044 100644 --- a/03_Collection Types.playground/section-1.swift +++ b/04_Collection Types.playground/section-1.swift @@ -37,17 +37,17 @@ shoppingList += ["Bird", "Shark"] shoppingList[1...3] = ["Bananas", "Apples", "Strawberries"] //Replace several items at once -shoppingList.insert("Maple Syrup", atIndex: 0) //Inserts element at index +shoppingList.insert("Maple Syrup", at: 0) //Inserts element at index -let mapleSyrup = shoppingList.removeAtIndex(0) // Returns removed item +let mapleSyrup = shoppingList.remove(at: 0) // Returns removed item var emptyArray = [Int]() //Initialize empty array var anotherEmptyArray = [] //Also valid -var array = [Int](count: 3, repeatedValue: 0) //Initalizes an array of length 3 with zeros +var array = [Int](repeating: 0, count: 3) //Initalizes an array of length 3 with zeros var compoundArray = array + emptyArray -var reversedShoppingList: [String] = shoppingList.reverse() +var reversedShoppingList: [String] = shoppingList.reversed() reversedShoppingList.removeLast() // Removes last item. Remove the first with removeFirst(). No returned value. reversedShoppingList.popLast() // Pops the last item, removing it from the array and also returning it. Note that if the array is empty, the returned value is nil. @@ -68,7 +68,7 @@ if let airportName = airports["DUB"] { //Subscript always returns optional in ca } airports["LAX"] = nil -airports.removeValueForKey("LAX") //Both remove the key-value pair +airports.removeValue(forKey: "LAX") //Both remove the key-value pair //Iterating over the whole dictionary for (airportCode, airportName) in airports { diff --git a/04_Control Flow.playground/playground.xcworkspace/contents.xcworkspacedata b/04_Control Flow.playground/playground.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a..0000000 --- a/04_Control Flow.playground/playground.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/04_Control Flow.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate b/04_Control Flow.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index d4e4779dc890fd6538ae2d94d5b2e1c95a12cacc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8404 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 diff --git a/04_Control Flow.playground/playground.xcworkspace/xcuserdata/nhat.tien.xcuserdatad/UserInterfaceState.xcuserstate b/04_Control Flow.playground/playground.xcworkspace/xcuserdata/nhat.tien.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index 5f6d51eb418cbe3a5010c6d8faf9069f9c23a1f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6846 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 diff --git a/04_Control Flow.playground/contents.xcplayground b/05_Control Flow.playground/contents.xcplayground similarity index 100% rename from 04_Control Flow.playground/contents.xcplayground rename to 05_Control Flow.playground/contents.xcplayground diff --git a/04_Control Flow.playground/section-1.swift b/05_Control Flow.playground/section-1.swift similarity index 99% rename from 04_Control Flow.playground/section-1.swift rename to 05_Control Flow.playground/section-1.swift index 8818faf..da72b94 100644 --- a/04_Control Flow.playground/section-1.swift +++ b/05_Control Flow.playground/section-1.swift @@ -110,4 +110,3 @@ master: while true { continue master } } - diff --git a/05_Functions.playground/playground.xcworkspace/contents.xcworkspacedata b/05_Functions.playground/playground.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a..0000000 --- a/05_Functions.playground/playground.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/05_Functions.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate b/05_Functions.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index 47d7cc3f9bfd3ec83b9329e8993c1c1060543dd1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8378 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 diff --git a/05_Functions.playground/playground.xcworkspace/xcuserdata/nhat.tien.xcuserdatad/UserInterfaceState.xcuserstate b/05_Functions.playground/playground.xcworkspace/xcuserdata/nhat.tien.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index 1b9a7d49a1c4669dca45363359487fb514deb2eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7064 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 TD?_XY2pRakR{jou+OPS4ZKjL| diff --git a/05_Functions.playground/section-1.swift.orig b/05_Functions.playground/section-1.swift.orig deleted file mode 100644 index c79b348..0000000 --- a/05_Functions.playground/section-1.swift.orig +++ /dev/null @@ -1,162 +0,0 @@ - -// |=------------------------------------------------------=| -// Copyright (c) 2016 Juan Antonio Karmy. -// Licensed under MIT License -// -// See https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ for Swift Language Reference -// -// See Juan Antonio Karmy - http://karmy.co | http://twitter.com/jkarmy -// -// |=------------------------------------------------------=| - -func sayHello(personName: String) -> String{ - return "Hello \(personName)!" -} - -<<<<<<< HEAD -//In this case we return a tuple -func minMax(array: [Int]) -> (min: Int, max:Int)? { - if array.isEmpty {return nil} - return (0,1) -} - -//Note: returning void translates in returning an empty tuple: () - -//Here we are using external and local params names. -//Also, note how the last param is predefined. This means we can omit it when calling the function. -//Also note that an external name will be provided automatically to every predefined param. -func join(string s1: String, toString s2: String, withJoiner joiner: String = " ") - -> String { - return s1 + joiner + s2 -} - -//A variadic param can take more than one value of a specified type. -func arithmeticMean(numbers: Double...) -> Double { - var total: Double = 0 - for number in numbers { - total += number -======= -import UIKit -import CoreBluetooth; - -class ViewController: UIViewController { - - override func viewDidLoad() { - super.viewDidLoad() - // Do any additional setup after loading the view, typically from a nib. - - sayHello("Juan") - - minMax([]) - - join(string: "Hello", toString: "World", withJoiner: "New") - join(string: "", toString: "") - - arithmeticMean(4,5,6,7) - - var someInt = 3 - var anotherInt = 107 - swapTwoInts(&someInt, b: &anotherInt) - - //Here we are defining a var of type function. - var mathFunction: (String) -> String = sayHello - } - - override func didReceiveMemoryWarning() { - super.didReceiveMemoryWarning() - // Dispose of any resources that can be recreated. - } - - func sayHello(personName: String) -> String{ - return "Hello \(personName)!" - } - - //In this case we return a tuple - func minMax(array: [Int]) -> (min: Int, max:Int)? { - if array.isEmpty {return nil} - return (0,1) - } - - //Note: returning void translates in returning an empty tuple: () - - //Here we are using external and local params names. - //Also, note how the last param is predefined. This means we can omit it when calling the function. - //Also note that an external name will be provided automatically to every predefined param. - func join(string s1: String, toString s2: String, withJoiner joiner: String = " ") - -> String { - return s1 + joiner + s2 - } - - //A variadic param can take more than one value of a specified type. - func arithmeticMean(numbers: Double...) -> Double { - var total: Double = 0 - for number in numbers { - total += number - } - return total / Double(numbers.count) - } - - //In this example, the inout prefix defines that the passed parameters' values can be modified, - //and this will be reflected on the original variables defined outside of the function. - func swapTwoInts(inout a: Int, inout b: Int) { - let temporaryA = a - a = b - b = temporaryA - } - - //You can use a function types to pass functions as params to other functions. - func printMathResult(mathFunction: (Int, Int) -> Int, a: Int, b: Int) { - print("Result: \(mathFunction(a, b))") - } - - //You can use function type to return functions. - //Here, we are also defining nested functions. These functions can only be accessed through the parent function. - //but can be passed as return values. - func chooseStepFunction(backwards: Bool) -> (Int) -> Int { - func stepForward(input: Int) -> Int { return input + 1 } - func stepBackward(input: Int) -> Int { return input - 1 } - return backwards ? stepBackward : stepForward ->>>>>>> master - } - return total / Double(numbers.count) -} - -//In this example, the inout prefix defines that the passed parameters' values can be modified, -//and this will be reflected on the original variables defined outside of the function. -func swapTwoInts(inout a: Int, inout b: Int) { - let temporaryA = a - a = b - b = temporaryA -} - -//You can use a function types to pass functions as params to other functions. -func printMathResult(mathFunction: (Int, Int) -> Int, a: Int, b: Int) { - print("Result: \(mathFunction(a, b))") -} - -//You can use function type to return functions. -//Here, we are also defining nested functions. These functions can only be accessed through the parent function. -//but can be passed as return values. -func chooseStepFunction(backwards: Bool) -> (Int) -> Int { - func stepForward(input: Int) -> Int { return input + 1 } - func stepBackward(input: Int) -> Int { return input - 1 } - return backwards ? stepBackward : stepForward -} - - -//Start -sayHello("Juan") - -minMax([]) - -join(string: "Hello", toString: "World", withJoiner: "New") -join(string: "", toString: "") - -arithmeticMean(4,5,6,7) - -var someInt = 3 -var anotherInt = 107 -swapTwoInts(&someInt, b: &anotherInt) - -//Here we are defining a var of type function. -var mathFunction: (String) -> String = sayHello \ No newline at end of file diff --git a/06_Closures.playground/playground.xcworkspace/contents.xcworkspacedata b/06_Closures.playground/playground.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a..0000000 --- a/06_Closures.playground/playground.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/06_Closures.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate b/06_Closures.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index e7a68361aa276a334595b570d8b095ad973b8605..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8643 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 ROh9SR|BvMV(Z8;*{~IFIqaOeO diff --git a/06_Closures.playground/playground.xcworkspace/xcuserdata/nhat.tien.xcuserdatad/UserInterfaceState.xcuserstate b/06_Closures.playground/playground.xcworkspace/xcuserdata/nhat.tien.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index a031d802b261d5fa72cca1e3ecc7cd24df860f1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7055 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 J@xSiqKLCa#gwp^3 diff --git a/05_Functions.playground/contents.xcplayground b/06_Functions.playground/contents.xcplayground similarity index 100% rename from 05_Functions.playground/contents.xcplayground rename to 06_Functions.playground/contents.xcplayground diff --git a/05_Functions.playground/section-1.swift b/06_Functions.playground/section-1.swift similarity index 93% rename from 05_Functions.playground/section-1.swift rename to 06_Functions.playground/section-1.swift index 8c9c5df..536c8ae 100644 --- a/05_Functions.playground/section-1.swift +++ b/06_Functions.playground/section-1.swift @@ -40,7 +40,7 @@ func arithmeticMean(numbers: Double...) -> Double { //In this example, the inout prefix defines that the passed parameters' values can be modified, //and this will be reflected on the original variables defined outside of the function. -func swapTwoInts(inout a: Int, inout b: Int) { +func swapTwoInts( a: inout Int, b: inout Int) { let temporaryA = a a = b b = temporaryA @@ -62,18 +62,18 @@ func chooseStepFunction(backwards: Bool) -> (Int) -> Int { //Start -sayHello("Juan") +sayHello(personName: "Juan") -minMax([]) +minMax(array: []) join(string: "Hello", toString: "World", withJoiner: "New") join(string: "", toString: "") -arithmeticMean(4,5,6,7) +arithmeticMean(numbers: 4,5,6,7) var someInt = 3 var anotherInt = 107 -swapTwoInts(&someInt, b: &anotherInt) +swapTwoInts(a: &someInt, b: &anotherInt) //Here we are defining a var of type function. var mathFunction: (String) -> String = sayHello diff --git a/06_Closures.playground/contents.xcplayground b/07_Closures.playground/contents.xcplayground similarity index 100% rename from 06_Closures.playground/contents.xcplayground rename to 07_Closures.playground/contents.xcplayground diff --git a/06_Closures.playground/section-1.swift b/07_Closures.playground/section-1.swift similarity index 57% rename from 06_Closures.playground/section-1.swift rename to 07_Closures.playground/section-1.swift index cee9470..88d55d0 100644 --- a/06_Closures.playground/section-1.swift +++ b/07_Closures.playground/section-1.swift @@ -15,22 +15,22 @@ =============== */ -let array = ["John", "Tim", "Steve"] +var array = ["John", "Tim", "Steve"] -var reversed = array.sort({(s1: String, s2: String) -> Bool in return s1 > s2}) +var reversed = array.sorted(isOrderedBefore: {(s1: String, s2: String) -> Bool in return s1 > s2}) //Using type inference, we can omit the params and return types. This is true when passing closures as params to a function. -reversed = array.sort({s1, s2 in return s1 > s2}) +reversed = array.sorted(isOrderedBefore: {s1, s2 in return s1 > s2}) //In case of single-expression closures, the return value is implicit, thus the return expression can be omitted. -reversed = array.sort({s1, s2 in s1 == s2}) +reversed = array.sorted(isOrderedBefore: {s1, s2 in s1 == s2}) //In the previous examples, the names of the closure's params were explicit. You can use the $X variables to refer to params for the closure. //This eliminates the need for the first params list, which makes the body the only relevant part. -reversed = array.sort({$0 == $1}) +reversed = array.sorted(isOrderedBefore: {$0 == $1}) //We can even take this to an extreme. String defines its own implementation for the ">" operator, which is really all the closure does. -reversed = array.sort(>) +reversed = array.sorted(isOrderedBefore: >) /*##### TRAILING CLOSURES #####*/ func someFunctionThatTakesAClosure(closure: () -> ()) { @@ -39,7 +39,7 @@ func someFunctionThatTakesAClosure(closure: () -> ()) { //Closures which are too long to be defined inline. // here's how you call this function without using a trailing closure: -someFunctionThatTakesAClosure({ +someFunctionThatTakesAClosure(closure: { // closure's body goes here }) @@ -70,3 +70,32 @@ let stringsArray = numbers.map { } return output } + +/* + ============ + AUTOCLOSURES + ============ + */ + +/* + An autoclosure is a closure that is automatically created to wrap an expression that’s being passed as an argument to a function. + It doesn’t take any arguments, and when it’s called, it returns the value of the expression that’s wrapped inside of it. + This syntactic convenience lets you omit braces around a function’s parameter by writing a normal expression instead of an explicit closure. + + An autoclosure lets you delay evaluation, because the code inside isn’t run until you call the closure. + */ + +var customersInLine = ["Chris", "Alex", "Ewa", "Barry", "Daniella"] +let customerProvider = { customersInLine.remove(at: 0) } + +// Traditional way +func serve(customer customerProvider: () -> String) { + print("Now serving \(customerProvider())!") //The closure is called here! +} +serve(customer: { customersInLine.remove(at: 0) } ) + +// @autoclosure way +func serve(customer customerProvider: @autoclosure () -> String) { + print("Now serving \(customerProvider())!") +} +serve(customer: customersInLine.remove(at: 0)) //We are not required to use the curly braces, since the code will be wrapped in a closure thanks to @autoclosure diff --git a/07_Enumerations.playground/playground.xcworkspace/contents.xcworkspacedata b/07_Enumerations.playground/playground.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a..0000000 --- a/07_Enumerations.playground/playground.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/07_Enumerations.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate b/07_Enumerations.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index 437a838c29bddf1904f959483ce6b1e5f849f74f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8402 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 diff --git a/08_Classes & Structs.playground/playground.xcworkspace/contents.xcworkspacedata b/08_Classes & Structs.playground/playground.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a..0000000 --- a/08_Classes & Structs.playground/playground.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/08_Classes & Structs.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate b/08_Classes & Structs.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index a0e311d3ffcf08a1a5a63c166ea61c531e2f101a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8436 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 If2U0QZ&#RIs{jB1 diff --git a/07_Enumerations.playground/contents.xcplayground b/08_Enumerations.playground/contents.xcplayground similarity index 100% rename from 07_Enumerations.playground/contents.xcplayground rename to 08_Enumerations.playground/contents.xcplayground diff --git a/07_Enumerations.playground/section-1.swift b/08_Enumerations.playground/section-1.swift similarity index 100% rename from 07_Enumerations.playground/section-1.swift rename to 08_Enumerations.playground/section-1.swift diff --git a/08_Classes & Structs.playground/contents.xcplayground b/09_Classes & Structs.playground/contents.xcplayground similarity index 100% rename from 08_Classes & Structs.playground/contents.xcplayground rename to 09_Classes & Structs.playground/contents.xcplayground diff --git a/08_Classes & Structs.playground/section-1.swift b/09_Classes & Structs.playground/section-1.swift similarity index 100% rename from 08_Classes & Structs.playground/section-1.swift rename to 09_Classes & Structs.playground/section-1.swift diff --git a/09_Properties.playground/playground.xcworkspace/contents.xcworkspacedata b/09_Properties.playground/playground.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a..0000000 --- a/09_Properties.playground/playground.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/09_Properties.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate b/09_Properties.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index 1cff64a6eed52c8081aad4ee6c22d7609e847fa9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8558 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 diff --git a/10_Methods.playground/playground.xcworkspace/contents.xcworkspacedata b/10_Methods.playground/playground.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a..0000000 --- a/10_Methods.playground/playground.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/10_Methods.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate b/10_Methods.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index f4e1b76f0896a1c1ba8ecc770cc3b1b9f9a9bddb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8537 zcmd5>d3;kQMGw)}t5fER{(#%(txoaP%@XT_foUmDe|?ji-L6at z`dW-Y7H`ARi{eB=`eNh6<>JDNqGdp&D9X z4)`GeL1=}!Fc0R#0=N|r?tsOx0`7+gU?n^V55YQk9M(f8Y=Z6ZBQWjlL}Hvs>uxEBqDK>S;R|jC2iz3(oSwC%gDWCIk}Il zAS=luu3{o(>b)2&ZW1~HoBB9qxaI~^ggYJ3tS7STfhnlU;{fOLLayWm8e2BYA_b#P`d@LgCyw7B(OmW^v8JA zp@GSw#_`yU*)t{TZm-KXZ?xapEIPQp?8ZdDOZ1Db2-iwyU9ry_^!q#>7Re57RBw@@ z79B-}Lx&X($<0a6&dMoF&&|)xP0!EDADv#BpPidul%JcEH@winrS&Etv+rRr#p|Ba zDwesJn(hX-=y!0}vF(NRL6$IA7s5o+sV#qKR$5YiPELFKiI7*bAg2Rt%u@OjkPAa$806K+4)roqRm)$+ z0P}mH-|t+|$uNQ-otF%5hVIZjU>-Kq6Ve3R$qqEzXl^ zN9fAzqFfh6qC^b18@*SdAW0|FcZ&fj;MlRzZjU(08EmSRFULFU#7H(x0~e$|0X0wy z(_se81P9y#PN;)=v|}Rn!E5kZybhDFFZRRaCqRS-XoUXEbYoyPc%T_lFa>ka$pXBR z{d&=di<$Yd9UNaG*0nY^ivC_oT9^p3ohJBPqN9S@&E@pFYCIvMRr*CyGP$ILyo;q| zm0Zx}>x$O8W_GZq7Y$CLIf)Ty^!r-9t`Jk%d?vO~A~rZ%J;7dgle%wBlIRA4Eb=Fd zEq*b;zBq%dbFiG_Bmu(GOSHlP)&}j6+5xv={|>kvQ)MlyDkBP(1;yro9ME^d-JNh3 zEW!bpj#*&>OJEroJK-K!ir3@7PPiAA;~*T2X){WyDto6P$F8NgnBZ*mx`VAQaazQ3 z$p!9PK>Cq0WfiQRUS3h+W;yHgI{hp)R>ANvzlUK>6u-w{EoNY*R1ys#>&PCGbWARo zey|tW4bU;OykbIY(8&@zlyhCMLCQLrYZq*EaHhzH9`;?()mwnguvN0y797$6+b~zM zSby1h-Ffow+z{4a2kevxJcUC$U>6RP}H2lj!n3!a7NU@zw3aLn(5=UHgJ zfFoEiIwU;@MzLcN7ZfX4`g$8fUn7FEba8Oz=)IzcAqdfR<^3_DuUQQG7s!tOqg1(G z!5dH?7V0&4OKKE5Mh(%lA2polDaGd>~gtxI6OK>9A zvft@A1GA?~8C&8EIx82nh_$jzA!%8GEexR<$tlrc%koXG9&AMl!}3svv4xx1Rn`*2 zYo+s97D%9}Cje{1Yf~nVcW~BvUvq}DrNtv=xPloikz5Na{0W=}<0kkN{sy1H=kNuV z;%FR$W3g-#{2jhz_4N#Vg*W3kRv0E=x#X3ENq%=Ti`FooN_Vpu2s)cvSg*cfsk^xp zH#z-I<_`a4r?*j@G1l!83q78)K%iCfTtZ=ey%-4i{0j=bUZ0%FQ{Ap$6N|Si=v8#P zHJV^@;fuR&D?6CKc3K~*yESUY#2qVG znoOz5&T>o;gH1kHfRn2V(G!D%>%+MA#2aJ5vLA# zj*?z074zH;!Tvc}ll;CA>d&lf64_<1+l>rzH8c6y-SI4dTAhv3h9aMDc4m+Ey<$5v zROg7DB(gfkigB2C*u$NqkEH(9mgJMylItAY^;i0>$DGmW+ewlna=&?hFPAyE)JTks za|bizdJ&d4qo*~VBq_`Z{fU(fAZ7_c*Es`XE&KF~9u~E8MFgCQ)w1}5$lxjE70g4O zWRO(!8T2OUQdDK&EvRRGxlPKGtO%AHo}1U+{x-=WLr5;$I+StABTOTs-{%X;wO(rP zex2~QIa@c3@cYzLh_~WhxCpbW$BPZ!z}d`% ziy*KF(5sPkmtf|!$?nFc(B?3kg=CS$2FV@dPI4Ev;#{1E^EXN(0a?NZH)#-9AdPGe zF0sn#cT4S-4LRaG2^a<@JLgq7J)yQ^k6!KWEEV;>P|QUwhK~FE42lNo{q7bvJg~N9 ziP{pPF2$?t?E4{SLj+Zj2gzy%gvcsv>mU!|ZT|!IBx@Md;}le zO#YLcC*ME{`6nB?*5H5OIu@ww*&j2p^yH#+ehV9?L|14Ek&3M}|8=9M$qdQLm_Mw8 zv_Wp)6~z-IblDn^{ll7MsaJ}427ILnG@?@!{UWi!=kN9?J0Vk(9%wL5td54;&y^&@ zs$M3)fU$%8jE{AYUvX`CAd&N`Fd&iZ-b!PrLXHuJqI#N6sQI*q_h@Kbm>kvO)8vMU!a??T=l!8Mj5kkzP*+ z_l_}|M$>U4ZjyA99vnpMC{J501--+L=Fp*0hlkNT+=5%#WXO)n-B3O^FDhK=NP1J$ zxdO)Yi5{krX93b-2iN+4M^#C^F;!9sQAxMLcq%E3rjq_WmSO|cRWVlBNn_|FNZm@u z(lUB89Y@F03ACI}#HVm4?!u>WH$H=V@Y$`h)R*~4m21M!M z&NWfTLQm}~+_#F6lZJ4Z%Lk=7L=JzMPk6PPO<_yRXoh?PW!?#HuRFq&C2!Pqcd-l` zr=E%|45fX z7L?t2^%Q-Ym0r4&?!qH@w3F_p&)_jUj%icoNlzZCnnVeACKuedHB{-73zp3feF;Gt zx*r%o(y_M#S@QJ(263o|9>f>$ZPrtIrRHlPE4=eNvjRgCB2SU8xIuBF;wD9*qEb<%s8-Y{rYmMDZc)@JT#5!o zlVYx7siISHLUCFtCElR&KsGO^uue?urzjCE=mGU9w zBg!?(waRtM^~w%qmvXQ2nDPVV85O9ssua}-)eKdOs$GSuJ5_h9mZ+Ah)~PnDwySoi zcB-CM9ZSwh|ZBX}7_f==8hp30D^VB2NqtpfJB6X#D zhPpxBs=iHqw|cF*Q@vBYTfIlUSN**D1@-6ZZ`2pm7u7$ge^g)A5RG1A)>t(*O`@is zCPkB~xn46!Q>F207HjU;Jg8Z%d05k>*{#{5c}}xWvtRR~=78p)=BVbl=A`Bw&3l@^ zYCh0>r1?biwdRLdQ|y4);#g;FbL^7X)v@biJ7T+HH^pv=-4?qi_PN-7vHN3Rj6D#0 zF!qBu8pp*Aj;n~99@h}p7}pZFAZ|rmN8GNsSK~g3`&-=Sai`!xeOh}!`-b*y?Yr7j+V|sK@y+pf#orVEc>I?5 z6Y=lqs7|LFrYqKs(@oV))79!`=o)k$-5lMmx^~?{-5t6|b=!0YbfmSxXs^6sFqTi<9u76Jd zvi`9Ci2j)Vg#N7loc_H2Tm1$7W&N)PVu&%s8-^KfFo*`PVYOk6;bp@?!&`mRh)x!a`l|ZHF9ol z3Ad3u#C^)0;lAR&<}PuUxnFp~$M8zt#`og~@B{h5d^$gZzlks8i}|tq&HQ-2oS(|y z!Z-7NKFH7I+xT{VA%6#dFTa}a;5YJ{`EC4meh2?Y{s@1RKgOTnKjA;)zu>>*&+upY z@AymnPyEmPuf}*IZ!{UrM!T_(@mgb&v9EEEG0!;CILcUHEH#cXmKnzxD~(QLgR#jt z%jh%CF$RpS#-+w5jYo|i8qXNd8qXQe8^1MPFkUoKlftAjX-sjZc$415nFg4KnZ}wL zO%I#)n+}=YFda4>H61sdG@Um6({#b~o#}faRi4b_%Zu zZwjY`kAzQzzX^XA{vmuNd@cNFjxlp)v)O94nXfe`nfsYj%z5UW=0oPU&8N*@n$MWe zn$MZfo4++*FkiH&EE-FkCElX9a2BIQuvjb!mQ2fdOM_*x>-W|ltUp>WCoE1_mGF4NhJ?<9 zjR~6*wkAB2@NB}~gy$1pNO&pX<%IWb#AdJ!vQ4(t+C-bz)@EC5yT`W7w%oSD_JD1z zZJlkst;5!3+hp5f+hyBtd)0Q#cGC8a?Ue0(+lRI@wzIZ#w)6Je?f2Rrus>*DZC_(w zYhPzyZ{K8p(*CUdfc=pD4f|pH5&L`g5A7e@Kec~mKX3ome!+e*aZ%#KiE9%(Lj4CQ O?f!gI{tW+5?D{WVr?6Q7 diff --git a/10_Methods.playground/playground.xcworkspace/xcuserdata/nhat.tien.xcuserdatad/UserInterfaceState.xcuserstate b/10_Methods.playground/playground.xcworkspace/xcuserdata/nhat.tien.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index dcd9b0da4d313b17413500ad2d8abc66765ab2b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6817 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 - - - - diff --git a/11_Subscripts.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate b/11_Subscripts.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index 65b7b6948b7c48e6428192524d0dafe566558b60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8558 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 F{{b5XqjvxR diff --git a/12_Inheritance.playground/playground.xcworkspace/contents.xcworkspacedata b/12_Inheritance.playground/playground.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a..0000000 --- a/12_Inheritance.playground/playground.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/12_Inheritance.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate b/12_Inheritance.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index 0948e5cc08a0c48031fdc166fe60f532211a25ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8390 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 Bool { return row >= 0 && row < rows && column >= 0 && column < columns @@ -30,12 +30,12 @@ struct Matrix { subscript(row: Int, column: Int) -> Double { //Subcripts can be read-write or read-only (no need for getters and setters in that case) get { - assert(indexIsValidForRow(row, column: column), "Index out of range") + assert(indexIsValidForRow(row: row, column: column), "Index out of range") return grid[(row * columns) + column] } //newValue is provided by default, but you can change the name of the received value. set { - assert(indexIsValidForRow(row, column: column), "Index out of range") + assert(indexIsValidForRow(row: row, column: column), "Index out of range") grid[(row * columns) + column] = newValue } } diff --git a/12_Inheritance.playground/contents.xcplayground b/13_Inheritance.playground/contents.xcplayground similarity index 100% rename from 12_Inheritance.playground/contents.xcplayground rename to 13_Inheritance.playground/contents.xcplayground diff --git a/12_Inheritance.playground/section-1.swift b/13_Inheritance.playground/section-1.swift similarity index 100% rename from 12_Inheritance.playground/section-1.swift rename to 13_Inheritance.playground/section-1.swift diff --git a/13_Initialization.playground/playground.xcworkspace/contents.xcworkspacedata b/13_Initialization.playground/playground.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a..0000000 --- a/13_Initialization.playground/playground.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/13_Initialization.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate b/13_Initialization.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index 253eaf9f9f24fbfcd58fcebd113720a848f2f016..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8414 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 Int { -<<<<<<< HEAD - var numberOfCoinsToVend = numberOfCoinsToVend - numberOfCoinsToVend = min(numberOfCoinsToVend, coinsInBank) - coinsInBank -= numberOfCoinsToVend - return numberOfCoinsToVend -======= - let numberOfCoinsAllowedToVend = min(numberOfCoinsToVend, coinsInBank) - coinsInBank -= numberOfCoinsAllowedToVend - return numberOfCoinsAllowedToVend ->>>>>>> a95249d306c181ad7bd6b22b803217e9f653f0c8 - } - static func receiveCoins(coins: Int) { - coinsInBank += coins - } -} - -class Player { - var coinsInPurse: Int - init(coins: Int) { - coinsInPurse = Bank.vendCoins(coins) - } - func winCoins(coins: Int) { - coinsInPurse += Bank.vendCoins(coins) - } - deinit { - Bank.receiveCoins(coinsInPurse) - } -} - -/* -An optional variable is used here, because players can leave the game at any point. -The optional lets you track whether there is currently a player in the game. -*/ -var playerOne: Player? = Player(coins: 100) -print("A new player has joined the game with \(playerOne!.coinsInPurse) coins") -// prints "A new player has joined the game with 100 coins" -print("There are now \(Bank.coinsInBank) coins left in the bank") -// prints "There are now 9900 coins left in the bank" - - -playerOne!.winCoins(2_000) -print("PlayerOne won 2000 coins & now has \(playerOne!.coinsInPurse) coins") -// prints "PlayerOne won 2000 coins & now has 2100 coins" -print("The bank now only has \(Bank.coinsInBank) coins left") -// prints "The bank now only has 7900 coins left" - - -playerOne = nil //Just before this happens, its deinitializer is called automatically. -print("PlayerOne has left the game") -// prints "PlayerOne has left the game" -print("The bank now has \(Bank.coinsInBank) coins") -// prints "The bank now has 10000 coins" diff --git a/14_Deinitialization.playground/playground.xcworkspace/contents.xcworkspacedata b/14_Deinitialization.playground/playground.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a..0000000 --- a/14_Deinitialization.playground/playground.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/14_Deinitialization.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate b/14_Deinitialization.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index c4f26f8ccd708139b61961494407167d134536b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8420 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 Ywmsk89Hvdc2yFO|o|Qi%@9nMs3%Ff;V*mgE diff --git a/14_Deinitialization.playground/playground.xcworkspace/xcuserdata/nhat.tien.xcuserdatad/UserInterfaceState.xcuserstate b/14_Deinitialization.playground/playground.xcworkspace/xcuserdata/nhat.tien.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index a37a9b891940b0f4736a8e346aec2844c662edb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7119 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 diff --git a/13_Initialization.playground/contents.xcplayground b/14_Initialization.playground/contents.xcplayground similarity index 100% rename from 13_Initialization.playground/contents.xcplayground rename to 14_Initialization.playground/contents.xcplayground diff --git a/13_Initialization.playground/section-1.swift b/14_Initialization.playground/section-1.swift similarity index 100% rename from 13_Initialization.playground/section-1.swift rename to 14_Initialization.playground/section-1.swift diff --git a/15_ARC.playground/Contents.swift b/15_ARC.playground/Contents.swift deleted file mode 100644 index 7e79e7d..0000000 --- a/15_ARC.playground/Contents.swift +++ /dev/null @@ -1,269 +0,0 @@ - -// |=------------------------------------------------------=| -// Copyright (c) 2016 Juan Antonio Karmy. -// Licensed under MIT License -// -// See https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ for Swift Language Reference -// -// See Juan Antonio Karmy - http://karmy.co | http://twitter.com/jkarmy -// -// |=------------------------------------------------------=| - - -import UIKit - -/* -Reference counting only applies to instances of classes. Structures and enumerations are value types, -not reference types, and are not stored and passed by reference. -*/ - -class Person { - let name: String - init(name: String) { - self.name = name - print("\(name) is being initialized") - } - deinit { - print("\(name) is being deinitialized") - } -} - -// At this point, these references are nil. -var reference1: Person? -var reference2: Person? -var reference3: Person? - -reference1 = Person(name: "John Appleseed") - -//At this point 3 strong references of "John Appleseed" are being stored. -reference2 = reference1 -reference3 = reference1 - -//John is still alive -reference1 = nil -reference2 = nil - -//John is dead by now. -reference3 = nil - - -/* -=============================================== -Strong Reference Cycles Between Class Instances -=============================================== -*/ - -class Apartment { - let unit: String - init(unit: String) { self.unit = unit } - var tenant: Person? - deinit { print("Apartment \(unit) is being deinitialized") } -} - -class Tenant : Person { - var apartment: Apartment? -} - -var john: Tenant? -var unit4A: Apartment? - -john = Tenant(name: "John Appleseed") -unit4A = Apartment(unit: "4A") - -//Here's where the reference cycle is created. -john!.apartment = unit4A -unit4A!.tenant = john - -// The variables are still references from inside the properties. This creates the reference cycle, -// and therefore, a memory leak. -// A simple way around this would be to manually set the apartment and tenant properties to nil, and then set the outside references to nil. -john = nil -unit4A = nil - - -/* -========================================================= -Resolving Strong Reference Cycles Between Class Instances -========================================================= - -Weak and unowned references enable one instance in a reference cycle to refer to the other instance -without keeping a strong hold on it. The instances can then refer to each other without creating a strong reference cycle. - -Use a weak reference whenever it is valid for that reference to become nil at some point during its lifetime. -Conversely, use an unowned reference when you know that the reference will never be nil once it has been set during initialization. -*/ - -// Weak References -/* -Use a weak reference to avoid reference cycles whenever it is possible for that reference to have “no value” -at some point in its life. If the reference will always have a value, use an unowned reference instead, -as described in Unowned References. In the Apartment example above, it is appropriate for an apartment to be able to -have “no tenant” at some point in its lifetime, and so a weak reference is an appropriate way to break the reference cycle in this case. - -NOTE - -Weak references must be declared as variables, to indicate that their value can change at runtime. A weak reference cannot be declared as a constant. -*/ - - -//Unowned References - -/* -Like weak references, an unowned reference does not keep a strong hold on the instance it refers to. Unlike a weak reference, -however, an unowned reference is assumed to always have a value. Because of this, an unowned reference is always defined as a -nonoptional type. You indicate an unowned reference by placing the unowned keyword before a property or variable declaration. - -Because an unowned reference is nonoptional, you don’t need to unwrap the unowned reference each time it is used. -An unowned reference can always be accessed directly. However, ARC cannot set the reference to nil when the instance it refers -to is deallocated, because variables of a nonoptional type cannot be set to nil. - -NOTE - -If you try to access an unowned reference after the instance that it references is deallocated, you will trigger a runtime error. -Use unowned references only when you are sure that the reference will always refer to an instance. - -Note also that Swift guarantees your app will crash if you try to access an unowned reference after the instance it references is deallocated. -You will never encounter unexpected behavior in this situation. Your app will always crash reliably, although you should, of course, prevent it from doing so. - -*/ - -class Customer { - let name: String - var card: CreditCard? - init(name: String) { - self.name = name - } - deinit { print("\(name) is being deinitialized") } -} - -class CreditCard { - let number: UInt64 - unowned let customer: Customer - init(number: UInt64, customer: Customer) { - self.number = number - self.customer = customer - } - deinit { print("Card #\(number) is being deinitialized") } -} - -var mike: Customer? -mike = Customer(name: "Mike Appleseed") -mike!.card = CreditCard(number: 1234_5678_9012_3456, customer: mike!) -mike = nil - - -/* -=============================================================== -Unowned References and Implicitly Unwrapped Optional Properties -=============================================================== - -However, there is a third scenario, in which both properties should always have a value, and neither property should ever be -nil once initialization is complete. In this scenario, it is useful to combine an unowned property on one class with an implicitly -unwrapped optional property on the other class. - -This enables both properties to be accessed directly (without optional unwrapping) once initialization is complete, while still -avoiding a reference cycle. This section shows you how to set up such a relationship. -*/ - - -class Country { - let name: String - var capitalCity: City! - init(name: String, capitalName: String) { - self.name = name - self.capitalCity = City(name: capitalName, country: self) - } -} - -class City { - let name: String - unowned let country: Country - init(name: String, country: Country) { - self.name = name - self.country = country - } -} - -/* -The initializer for City is called from within the initializer for Country. However, the initializer for Country cannot pass -self to the City initializer until a new Country instance is fully initialized, as described in Two-Phase Initialization. - -To cope with this requirement, you declare the capitalCity property of Country as an implicitly unwrapped optional property, -indicated by the exclamation mark at the end of its type annotation (City!). This means that the capitalCity property has a -default value of nil, like any other optional, but can be accessed without the need to unwrap its value as described in Implicitly Unwrapped Optionals. - -Because capitalCity has a default nil value, a new Country instance is considered fully initialized as soon as the Country instance -sets its name property within its initializer. This means that the Country initializer can start to reference and pass around the -implicit self property as soon as the name property is set. The Country initializer can therefore pass self as one of the parameters -for the City initializer when the Country initializer is setting its own capitalCity property. -*/ - - - -/* -==================================== -Strong Reference Cycles for Closures -==================================== - -A strong reference cycle can also occur if you assign a closure to a property of a class instance, and the body of that -closure captures the instance. This capture might occur because the closure’s body accesses a property of the instance, -such as self.someProperty, or because the closure calls a method on the instance, such as self.someMethod(). In either case, -these accesses cause the closure to “capture” self, creating a strong reference cycle. - -Swift provides an elegant solution to this problem, known as a closure capture list. -*/ - -class HTMLElement { - - let name: String - let text: String? - - lazy var asHTML: Void -> String = { - if let text = self.text { - return "<\(self.name)>\(text)" - } else { - return "<\(self.name) />" - } - } - - init(name: String, text: String? = nil) { - self.name = name - self.text = text - } - - deinit { - print("\(name) is being deinitialized") - } - -} - -/* -A capture list defines the rules to use when capturing one or more reference types within the closure’s body. -As with strong reference cycles between two class instances, you declare each captured reference to be a weak or unowned reference rather than a strong reference. -*/ - -class HTMLElement2 { - - let name: String - let text: String? - - lazy var asHTML: Void -> String = { - [unowned self] in //Closure List - if let text = self.text { - return "<\(self.name)>\(text)" - } else { - return "<\(self.name) />" - } - } - - init(name: String, text: String? = nil) { - self.name = name - self.text = text - } - - deinit { - print("\(name) is being deinitialized") - } - -} - diff --git a/15_ARC.playground/playground.xcworkspace/contents.xcworkspacedata b/15_ARC.playground/playground.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a..0000000 --- a/15_ARC.playground/playground.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/15_ARC.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate b/15_ARC.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index 3eaf6d3706a6a04cfb6a98d619c8f8597c68099a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12990 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 Zzcc;b^mRN^LWuv*bQje5D*)0v{|CCKLr4Gs diff --git a/14_Deinitialization.playground/Contents.swift b/15_Deinitialization.playground/Contents.swift similarity index 69% rename from 14_Deinitialization.playground/Contents.swift rename to 15_Deinitialization.playground/Contents.swift index a36b123..1fbe176 100644 --- a/14_Deinitialization.playground/Contents.swift +++ b/15_Deinitialization.playground/Contents.swift @@ -14,12 +14,12 @@ import UIKit // Deinitializers are only available on class types. /* -Deinitializers are called automatically, just before instance deallocation takes place. -You are not allowed to call a deinitializer yourself. -Superclass deinitializers are inherited by their subclasses, and the superclass deinitializer -is called automatically at the end of a subclass deinitializer implementation. -Superclass deinitializers are always called, even if a subclass does not provide its own deinitializer. -*/ + Deinitializers are called automatically, just before instance deallocation takes place. + You are not allowed to call a deinitializer yourself. + Superclass deinitializers are inherited by their subclasses, and the superclass deinitializer + is called automatically at the end of a subclass deinitializer implementation. + Superclass deinitializers are always called, even if a subclass does not provide its own deinitializer. + */ class Bank { static var coinsInBank = 10_000 @@ -36,20 +36,20 @@ class Bank { class Player { var coinsInPurse: Int init(coins: Int) { - coinsInPurse = Bank.vendCoins(coins) + coinsInPurse = Bank.vendCoins(numberOfCoinsToVend: coins) } func winCoins(coins: Int) { - coinsInPurse += Bank.vendCoins(coins) + coinsInPurse += Bank.vendCoins(numberOfCoinsToVend: coins) } deinit { - Bank.receiveCoins(coinsInPurse) + Bank.receiveCoins(coins: coinsInPurse) } } /* -An optional variable is used here, because players can leave the game at any point. -The optional lets you track whether there is currently a player in the game. -*/ + An optional variable is used here, because players can leave the game at any point. + The optional lets you track whether there is currently a player in the game. + */ var playerOne: Player? = Player(coins: 100) print("A new player has joined the game with \(playerOne!.coinsInPurse) coins") // prints "A new player has joined the game with 100 coins" @@ -57,7 +57,7 @@ print("There are now \(Bank.coinsInBank) coins left in the bank") // prints "There are now 9900 coins left in the bank" -playerOne!.winCoins(2_000) +playerOne!.winCoins(coins: 2_000) print("PlayerOne won 2000 coins & now has \(playerOne!.coinsInPurse) coins") // prints "PlayerOne won 2000 coins & now has 2100 coins" print("The bank now only has \(Bank.coinsInBank) coins left") diff --git a/14_Deinitialization.playground/contents.xcplayground b/15_Deinitialization.playground/contents.xcplayground similarity index 100% rename from 14_Deinitialization.playground/contents.xcplayground rename to 15_Deinitialization.playground/contents.xcplayground diff --git a/16_ARC.playground/Contents.swift b/16_ARC.playground/Contents.swift new file mode 100644 index 0000000..ce5b29d --- /dev/null +++ b/16_ARC.playground/Contents.swift @@ -0,0 +1,269 @@ + +// |=------------------------------------------------------=| +// Copyright (c) 2016 Juan Antonio Karmy. +// Licensed under MIT License +// +// See https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ for Swift Language Reference +// +// See Juan Antonio Karmy - http://karmy.co | http://twitter.com/jkarmy +// +// |=------------------------------------------------------=| + + +import UIKit + +/* + Reference counting only applies to instances of classes. Structures and enumerations are value types, + not reference types, and are not stored and passed by reference. + */ + +class Person { + let name: String + init(name: String) { + self.name = name + print("\(name) is being initialized") + } + deinit { + print("\(name) is being deinitialized") + } +} + +// At this point, these references are nil. +var reference1: Person? +var reference2: Person? +var reference3: Person? + +reference1 = Person(name: "John Appleseed") + +//At this point 3 strong references of "John Appleseed" are being stored. +reference2 = reference1 +reference3 = reference1 + +//John is still alive +reference1 = nil +reference2 = nil + +//John is dead by now. +reference3 = nil + + +/* + =============================================== + Strong Reference Cycles Between Class Instances + =============================================== + */ + +class Apartment { + let unit: String + init(unit: String) { self.unit = unit } + var tenant: Person? + deinit { print("Apartment \(unit) is being deinitialized") } +} + +class Tenant : Person { + var apartment: Apartment? +} + +var john: Tenant? +var unit4A: Apartment? + +john = Tenant(name: "John Appleseed") +unit4A = Apartment(unit: "4A") + +//Here's where the reference cycle is created. +john!.apartment = unit4A +unit4A!.tenant = john + +// The variables are still references from inside the properties. This creates the reference cycle, +// and therefore, a memory leak. +// A simple way around this would be to manually set the apartment and tenant properties to nil, and then set the outside references to nil. +john = nil +unit4A = nil + + +/* + ========================================================= + Resolving Strong Reference Cycles Between Class Instances + ========================================================= + + Weak and unowned references enable one instance in a reference cycle to refer to the other instance + without keeping a strong hold on it. The instances can then refer to each other without creating a strong reference cycle. + + Use a weak reference whenever it is valid for that reference to become nil at some point during its lifetime. + Conversely, use an unowned reference when you know that the reference will never be nil once it has been set during initialization. + */ + +// Weak References +/* + Use a weak reference to avoid reference cycles whenever it is possible for that reference to have “no value” + at some point in its life. If the reference will always have a value, use an unowned reference instead, + as described in Unowned References. In the Apartment example above, it is appropriate for an apartment to be able to + have “no tenant” at some point in its lifetime, and so a weak reference is an appropriate way to break the reference cycle in this case. + + NOTE + + Weak references must be declared as variables, to indicate that their value can change at runtime. A weak reference cannot be declared as a constant. + */ + + +//Unowned References + +/* + Like weak references, an unowned reference does not keep a strong hold on the instance it refers to. Unlike a weak reference, + however, an unowned reference is assumed to always have a value. Because of this, an unowned reference is always defined as a + nonoptional type. You indicate an unowned reference by placing the unowned keyword before a property or variable declaration. + + Because an unowned reference is nonoptional, you don’t need to unwrap the unowned reference each time it is used. + An unowned reference can always be accessed directly. However, ARC cannot set the reference to nil when the instance it refers + to is deallocated, because variables of a nonoptional type cannot be set to nil. + + NOTE + + If you try to access an unowned reference after the instance that it references is deallocated, you will trigger a runtime error. + Use unowned references only when you are sure that the reference will always refer to an instance. + + Note also that Swift guarantees your app will crash if you try to access an unowned reference after the instance it references is deallocated. + You will never encounter unexpected behavior in this situation. Your app will always crash reliably, although you should, of course, prevent it from doing so. + + */ + +class Customer { + let name: String + var card: CreditCard? + init(name: String) { + self.name = name + } + deinit { print("\(name) is being deinitialized") } +} + +class CreditCard { + let number: UInt64 + unowned let customer: Customer + init(number: UInt64, customer: Customer) { + self.number = number + self.customer = customer + } + deinit { print("Card #\(number) is being deinitialized") } +} + +var mike: Customer? +mike = Customer(name: "Mike Appleseed") +mike!.card = CreditCard(number: 1234_5678_9012_3456, customer: mike!) +mike = nil + + +/* + =============================================================== + Unowned References and Implicitly Unwrapped Optional Properties + =============================================================== + + However, there is a third scenario, in which both properties should always have a value, and neither property should ever be + nil once initialization is complete. In this scenario, it is useful to combine an unowned property on one class with an implicitly + unwrapped optional property on the other class. + + This enables both properties to be accessed directly (without optional unwrapping) once initialization is complete, while still + avoiding a reference cycle. This section shows you how to set up such a relationship. + */ + + +class Country { + let name: String + var capitalCity: City! + init(name: String, capitalName: String) { + self.name = name + self.capitalCity = City(name: capitalName, country: self) + } +} + +class City { + let name: String + unowned let country: Country + init(name: String, country: Country) { + self.name = name + self.country = country + } +} + +/* + The initializer for City is called from within the initializer for Country. However, the initializer for Country cannot pass + self to the City initializer until a new Country instance is fully initialized, as described in Two-Phase Initialization. + + To cope with this requirement, you declare the capitalCity property of Country as an implicitly unwrapped optional property, + indicated by the exclamation mark at the end of its type annotation (City!). This means that the capitalCity property has a + default value of nil, like any other optional, but can be accessed without the need to unwrap its value as described in Implicitly Unwrapped Optionals. + + Because capitalCity has a default nil value, a new Country instance is considered fully initialized as soon as the Country instance + sets its name property within its initializer. This means that the Country initializer can start to reference and pass around the + implicit self property as soon as the name property is set. The Country initializer can therefore pass self as one of the parameters + for the City initializer when the Country initializer is setting its own capitalCity property. + */ + + + +/* + ==================================== + Strong Reference Cycles for Closures + ==================================== + + A strong reference cycle can also occur if you assign a closure to a property of a class instance, and the body of that + closure captures the instance. This capture might occur because the closure’s body accesses a property of the instance, + such as self.someProperty, or because the closure calls a method on the instance, such as self.someMethod(). In either case, + these accesses cause the closure to “capture” self, creating a strong reference cycle. + + Swift provides an elegant solution to this problem, known as a closure capture list. + */ + +class HTMLElement { + + let name: String + let text: String? + + lazy var asHTML: (Void) -> String = { + if let text = self.text { + return "<\(self.name)>\(text)" + } else { + return "<\(self.name) />" + } + } + + init(name: String, text: String? = nil) { + self.name = name + self.text = text + } + + deinit { + print("\(name) is being deinitialized") + } + +} + +/* + A capture list defines the rules to use when capturing one or more reference types within the closure’s body. + As with strong reference cycles between two class instances, you declare each captured reference to be a weak or unowned reference rather than a strong reference. + */ + +class HTMLElement2 { + + let name: String + let text: String? + + lazy var asHTML: (Void) -> String = { + [unowned self] in //Closure List + if let text = self.text { + return "<\(self.name)>\(text)" + } else { + return "<\(self.name) />" + } + } + + init(name: String, text: String? = nil) { + self.name = name + self.text = text + } + + deinit { + print("\(name) is being deinitialized") + } + +} + diff --git a/15_ARC.playground/contents.xcplayground b/16_ARC.playground/contents.xcplayground similarity index 100% rename from 15_ARC.playground/contents.xcplayground rename to 16_ARC.playground/contents.xcplayground diff --git a/16_Optional Chaining.playground/playground.xcworkspace/contents.xcworkspacedata b/16_Optional Chaining.playground/playground.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a..0000000 --- a/16_Optional Chaining.playground/playground.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/16_Optional Chaining.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate b/16_Optional Chaining.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index 23b0db8846ae42bc065f52c566100a7f6407dcea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13730 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 diff --git a/16_Optional Chaining.playground/playground.xcworkspace/xcuserdata/nhat.tien.xcuserdatad/UserInterfaceState.xcuserstate b/16_Optional Chaining.playground/playground.xcworkspace/xcuserdata/nhat.tien.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index 18076fc32f363b8263b96827afd7ba736a2b5a01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7132 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 Z*dabHJ|R96ZGC`{?(bE~ckHit`k%@3mbd@_ diff --git a/17_Error_Handling.playground/Contents.swift b/17_Error_Handling.playground/Contents.swift deleted file mode 100644 index 5016ecc..0000000 --- a/17_Error_Handling.playground/Contents.swift +++ /dev/null @@ -1,221 +0,0 @@ - -// |=------------------------------------------------------=| -// Copyright (c) 2016 Juan Antonio Karmy. -// Licensed under MIT License -// -// See https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ for Swift Language Reference -// -// See Juan Antonio Karmy - http://karmy.co | http://twitter.com/jkarmy -// -// |=------------------------------------------------------=| - - -import UIKit - -/* -================================ -Representing and Throwing Errors -================================ -*/ - -/* -Swift enumerations are particularly well suited to modeling a group of related error conditions, -with associated values allowing for additional information about the nature of an error to be communicated. -*/ - -enum VendingMachineError: ErrorType { - case InvalidSelection - case InsufficientFunds(coinsNeeded: Int) - case OutOfStock -} - -throw VendingMachineError.InsufficientFunds(coinsNeeded: 5) - -/* -Error handling in Swift resembles exception handling in other languages, with the use of the try, catch and throw keywords. -Unlike exception handling in many languages—including Objective-C—error handling in Swift does not involve unwinding the call stack, -a process that can be computationally expensive. As such, the performance characteristics of a throw statement are comparable to those of a return statement. -*/ - -/* -=========================================== -Propagating Errors Using Throwing Functions -=========================================== -*/ - -/* -To indicate that a function, method, or initializer can throw an error, -you write the throws keyword in the function’s declaration after its parameters. -*/ - -func canThrowErrors() throws -> String { return "" } - -func cannotThrowErrors() -> String { return "" } -// A throwing function propagates errors that are thrown inside of it to the scope from which it’s called. -// Only throwing functions can propagate errors. Any errors thrown inside a nonthrowing function must be handled inside the function. - -struct Item { - var price: Int - var count: Int -} - -class VendingMachine { - var inventory = [ - "Candy Bar": Item(price: 12, count: 7), - "Chips": Item(price: 10, count: 4), - "Pretzels": Item(price: 7, count: 11) - ] - var coinsDeposited = 0 - func dispenseSnack(snack: String) { - print("Dispensing \(snack)") - } - - func vend(itemNamed name: String) throws { - guard var item = inventory[name] else { - throw VendingMachineError.InvalidSelection - } - - guard item.count > 0 else { - throw VendingMachineError.OutOfStock - } - - guard item.price <= coinsDeposited else { - throw VendingMachineError.InsufficientFunds(coinsNeeded: item.price - coinsDeposited) - } - - coinsDeposited -= item.price - item.count -= 1 - inventory[name] = item - dispenseSnack(name) - } -} - -/* -The implementation of the vend(itemNamed:) method uses guard statements to exit the method early -and throw appropriate errors if any of the requirements for purchasing a snack aren’t met. -Because a throw statement immediately transfers program control, an item will be vended only if all of these requirements are met. -*/ - - -/* -============================== -Handling Errors Using Do-Catch -============================== -*/ - -func buyFavoriteSnack(name: String, vendingMachine: VendingMachine) throws{ - throw VendingMachineError.InvalidSelection -} - - -var vendingMachine = VendingMachine() -vendingMachine.coinsDeposited = 8 -do { - try buyFavoriteSnack("Alice", vendingMachine: vendingMachine) -} catch VendingMachineError.InvalidSelection { - print("Invalid Selection.") -} catch VendingMachineError.OutOfStock { - print("Out of Stock.") -} catch VendingMachineError.InsufficientFunds(let coinsNeeded) { - print("Insufficient funds. Please insert an additional \(coinsNeeded) coins.") -} - - -/* -==================================== -Converting Errors to Optional Values -==================================== -*/ - -func someThrowingFunction() throws -> Int { - // ... - return 2 -} - -let x = try? someThrowingFunction() - -let y: Int? -do { - y = try someThrowingFunction() -} catch { - y = nil -} - - -/* -If someThrowingFunction() throws an error, the value of x and y is nil. Otherwise, the value of x and y -is the value that the function returned. Note that x and y are an optional of whatever type someThrowingFunction() returns. -Here the function returns an integer, so x and y are optional integers. - -Using try? lets you write concise error handling code when you want to handle all errors in the same way. -For example, the following code uses several approaches to fetch data, or returns nil if all of the approaches fail. -*/ - - - -/* -=========================== -Disabling Error Propagation -=========================== -*/ - -func loadImage(path: String) throws ->String { - return "Image" -} - -let photo = try! loadImage("./Resources/John Appleseed.jpg") - - -/* -Sometimes you know a throwing function or method won’t, in fact, throw an error at runtime. -On those occasions, you can write try! before the expression to disable error propagation and wrap the call in a -runtime assertion that no error will be thrown. If an error actually is thrown, you’ll get a runtime error. -*/ - - -/* -========================== -Specifying Cleanup Actions -========================== -*/ - -func exists(file: String) -> Bool{ - return true -} - -func openFile(file: String) -> String{ - return "" -} - -func close(file: String) -> Void{ - -} - -func processFile(filename: String) throws { - if exists(filename) { - let file = openFile(filename) - defer { - close(file) - } -// while let line = try file.readline() { -// // Work with the file. -// } - // close(file) is called here, at the end of the scope. - } -} - - -/* -You use a defer statement to execute a set of statements just before code execution leaves the current block of code. -This statement lets you do any necessary cleanup that should be performed regardless of how execution leaves the current block -of code—whether it leaves because an error was thrown or because of a statement such as return or break. -For example, you can use a defer statement to ensure that file descriptors are closed and manually allocated memory is freed. - -A defer statement defers execution until the current scope is exited. This statement consists of the defer keyword and the statements -to be executed later. The deferred statements may not contain any code that would transfer control out of the statements, -such as a break or a return statement, or by throwing an error. Deferred actions are executed in reverse order of how they are -specified—that is, the code in the first defer statement executes after code in the second, and so on. - -You can use a defer statement even when no error handling code is involved. -*/ - diff --git a/17_Error_Handling.playground/Contents.swift.orig b/17_Error_Handling.playground/Contents.swift.orig deleted file mode 100644 index d407d14..0000000 --- a/17_Error_Handling.playground/Contents.swift.orig +++ /dev/null @@ -1,225 +0,0 @@ - -// |=------------------------------------------------------=| -// Copyright (c) 2016 Juan Antonio Karmy. -// Licensed under MIT License -// -// See https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ for Swift Language Reference -// -// See Juan Antonio Karmy - http://karmy.co | http://twitter.com/jkarmy -// -// |=------------------------------------------------------=| - - -import UIKit - -/* -================================ -Representing and Throwing Errors -================================ -*/ - -/* -Swift enumerations are particularly well suited to modeling a group of related error conditions, -with associated values allowing for additional information about the nature of an error to be communicated. -*/ - -enum VendingMachineError: ErrorType { - case InvalidSelection - case InsufficientFunds(coinsNeeded: Int) - case OutOfStock -} - -throw VendingMachineError.InsufficientFunds(coinsNeeded: 5) - -/* -Error handling in Swift resembles exception handling in other languages, with the use of the try, catch and throw keywords. -Unlike exception handling in many languages—including Objective-C—error handling in Swift does not involve unwinding the call stack, -a process that can be computationally expensive. As such, the performance characteristics of a throw statement are comparable to those of a return statement. -*/ - -/* -=========================================== -Propagating Errors Using Throwing Functions -=========================================== -*/ - -/* -To indicate that a function, method, or initializer can throw an error, -you write the throws keyword in the function’s declaration after its parameters. -*/ - -func canThrowErrors() throws -> String { return "" } - -func cannotThrowErrors() -> String { return "" } -// A throwing function propagates errors that are thrown inside of it to the scope from which it’s called. -// Only throwing functions can propagate errors. Any errors thrown inside a nonthrowing function must be handled inside the function. - -struct Item { - var price: Int - var count: Int -} - -class VendingMachine { - var inventory = [ - "Candy Bar": Item(price: 12, count: 7), - "Chips": Item(price: 10, count: 4), - "Pretzels": Item(price: 7, count: 11) - ] - var coinsDeposited = 0 - func dispenseSnack(snack: String) { - print("Dispensing \(snack)") - } - - func vend(itemNamed name: String) throws { - guard var item = inventory[name] else { - throw VendingMachineError.InvalidSelection - } - - guard item.count > 0 else { - throw VendingMachineError.OutOfStock - } - - guard item.price <= coinsDeposited else { - throw VendingMachineError.InsufficientFunds(coinsNeeded: item.price - coinsDeposited) - } - - coinsDeposited -= item.price -<<<<<<< HEAD - item.count -======= - item.count -= 1 ->>>>>>> a95249d306c181ad7bd6b22b803217e9f653f0c8 - inventory[name] = item - dispenseSnack(name) - } -} - -/* -The implementation of the vend(itemNamed:) method uses guard statements to exit the method early -and throw appropriate errors if any of the requirements for purchasing a snack aren’t met. -Because a throw statement immediately transfers program control, an item will be vended only if all of these requirements are met. -*/ - - -/* -============================== -Handling Errors Using Do-Catch -============================== -*/ - -func buyFavoriteSnack(name: String, vendingMachine: VendingMachine) throws{ - throw VendingMachineError.InvalidSelection -} - - -var vendingMachine = VendingMachine() -vendingMachine.coinsDeposited = 8 -do { - try buyFavoriteSnack("Alice", vendingMachine: vendingMachine) -} catch VendingMachineError.InvalidSelection { - print("Invalid Selection.") -} catch VendingMachineError.OutOfStock { - print("Out of Stock.") -} catch VendingMachineError.InsufficientFunds(let coinsNeeded) { - print("Insufficient funds. Please insert an additional \(coinsNeeded) coins.") -} - - -/* -==================================== -Converting Errors to Optional Values -==================================== -*/ - -func someThrowingFunction() throws -> Int { - // ... - return 2 -} - -let x = try? someThrowingFunction() - -let y: Int? -do { - y = try someThrowingFunction() -} catch { - y = nil -} - - -/* -If someThrowingFunction() throws an error, the value of x and y is nil. Otherwise, the value of x and y -is the value that the function returned. Note that x and y are an optional of whatever type someThrowingFunction() returns. -Here the function returns an integer, so x and y are optional integers. - -Using try? lets you write concise error handling code when you want to handle all errors in the same way. -For example, the following code uses several approaches to fetch data, or returns nil if all of the approaches fail. -*/ - - - -/* -=========================== -Disabling Error Propagation -=========================== -*/ - -func loadImage(path: String) throws ->String { - return "Image" -} - -let photo = try! loadImage("./Resources/John Appleseed.jpg") - - -/* -Sometimes you know a throwing function or method won’t, in fact, throw an error at runtime. -On those occasions, you can write try! before the expression to disable error propagation and wrap the call in a -runtime assertion that no error will be thrown. If an error actually is thrown, you’ll get a runtime error. -*/ - - -/* -========================== -Specifying Cleanup Actions -========================== -*/ - -func exists(file: String) -> Bool{ - return true -} - -func openFile(file: String) -> String{ - return "" -} - -func close(file: String) -> Void{ - -} - -func processFile(filename: String) throws { - if exists(filename) { - let file = openFile(filename) - defer { - close(file) - } -// while let line = try file.readline() { -// // Work with the file. -// } - // close(file) is called here, at the end of the scope. - } -} - - -/* -You use a defer statement to execute a set of statements just before code execution leaves the current block of code. -This statement lets you do any necessary cleanup that should be performed regardless of how execution leaves the current block -of code—whether it leaves because an error was thrown or because of a statement such as return or break. -For example, you can use a defer statement to ensure that file descriptors are closed and manually allocated memory is freed. - -A defer statement defers execution until the current scope is exited. This statement consists of the defer keyword and the statements -to be executed later. The deferred statements may not contain any code that would transfer control out of the statements, -such as a break or a return statement, or by throwing an error. Deferred actions are executed in reverse order of how they are -specified—that is, the code in the first defer statement executes after code in the second, and so on. - -You can use a defer statement even when no error handling code is involved. -*/ - diff --git a/17_Error_Handling.playground/playground.xcworkspace/contents.xcworkspacedata b/17_Error_Handling.playground/playground.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a..0000000 --- a/17_Error_Handling.playground/playground.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/17_Error_Handling.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate b/17_Error_Handling.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index 23dac431eddca5ef53edbb69445aa8064b7a7bd8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14580 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 R`5?r9GB5F;!N2Ll{|6WeRE7Wm diff --git a/17_Error_Handling.playground/playground.xcworkspace/xcuserdata/nhat.tien.xcuserdatad/UserInterfaceState.xcuserstate b/17_Error_Handling.playground/playground.xcworkspace/xcuserdata/nhat.tien.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index af2082b8972c4e64b26f0657380e51f142f3d812..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7165 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 String { return "" } + +func cannotThrowErrors() -> String { return "" } +// A throwing function propagates errors that are thrown inside of it to the scope from which it’s called. +// Only throwing functions can propagate errors. Any errors thrown inside a nonthrowing function must be handled inside the function. + +struct Item { + var price: Int + var count: Int +} + +class VendingMachine { + var inventory = [ + "Candy Bar": Item(price: 12, count: 7), + "Chips": Item(price: 10, count: 4), + "Pretzels": Item(price: 7, count: 11) + ] + var coinsDeposited = 0 + func dispenseSnack(snack: String) { + print("Dispensing \(snack)") + } + + func vend(itemNamed name: String) throws { + guard var item = inventory[name] else { + throw VendingMachineError.InvalidSelection + } + + guard item.count > 0 else { + throw VendingMachineError.OutOfStock + } + + guard item.price <= coinsDeposited else { + throw VendingMachineError.InsufficientFunds(coinsNeeded: item.price - coinsDeposited) + } + + coinsDeposited -= item.price + item.count -= 1 + inventory[name] = item + dispenseSnack(snack: name) + } +} + +/* + The implementation of the vend(itemNamed:) method uses guard statements to exit the method early + and throw appropriate errors if any of the requirements for purchasing a snack aren’t met. + Because a throw statement immediately transfers program control, an item will be vended only if all of these requirements are met. + */ + + +/* + ============================== + Handling Errors Using Do-Catch + ============================== + */ + +func buyFavoriteSnack(name: String, vendingMachine: VendingMachine) throws{ + throw VendingMachineError.InvalidSelection +} + + +var vendingMachine = VendingMachine() +vendingMachine.coinsDeposited = 8 +do { + try buyFavoriteSnack(name: "Alice", vendingMachine: vendingMachine) +} catch VendingMachineError.InvalidSelection { + print("Invalid Selection.") +} catch VendingMachineError.OutOfStock { + print("Out of Stock.") +} catch VendingMachineError.InsufficientFunds(let coinsNeeded) { + print("Insufficient funds. Please insert an additional \(coinsNeeded) coins.") +} + + +/* + ==================================== + Converting Errors to Optional Values + ==================================== + */ + +func someThrowingFunction() throws -> Int { + // ... + return 2 +} + +let x = try? someThrowingFunction() + +let y: Int? +do { + y = try someThrowingFunction() +} catch { + y = nil +} + + +/* + If someThrowingFunction() throws an error, the value of x and y is nil. Otherwise, the value of x and y + is the value that the function returned. Note that x and y are an optional of whatever type someThrowingFunction() returns. + Here the function returns an integer, so x and y are optional integers. + + Using try? lets you write concise error handling code when you want to handle all errors in the same way. + For example, the following code uses several approaches to fetch data, or returns nil if all of the approaches fail. + */ + + + +/* + =========================== + Disabling Error Propagation + =========================== + */ + +func loadImage(path: String) throws ->String { + return "Image" +} + +let photo = try! loadImage(path: "./Resources/John Appleseed.jpg") + + +/* + Sometimes you know a throwing function or method won’t, in fact, throw an error at runtime. + On those occasions, you can write try! before the expression to disable error propagation and wrap the call in a + runtime assertion that no error will be thrown. If an error actually is thrown, you’ll get a runtime error. + */ + + +/* + ========================== + Specifying Cleanup Actions + ========================== + */ + +func exists(file: String) -> Bool{ + return true +} + +func openFile(file: String) -> String{ + return "" +} + +func close(file: String) -> Void{ + +} + +func processFile(filename: String) throws { + if exists(file: filename) { + let file = openFile(file: filename) + defer { + close(file: file) + } + // while let line = try file.readline() { + // // Work with the file. + // } + // close(file) is called here, at the end of the scope. + } +} + + +/* + You use a defer statement to execute a set of statements just before code execution leaves the current block of code. + This statement lets you do any necessary cleanup that should be performed regardless of how execution leaves the current block + of code—whether it leaves because an error was thrown or because of a statement such as return or break. + For example, you can use a defer statement to ensure that file descriptors are closed and manually allocated memory is freed. + + A defer statement defers execution until the current scope is exited. This statement consists of the defer keyword and the statements + to be executed later. The deferred statements may not contain any code that would transfer control out of the statements, + such as a break or a return statement, or by throwing an error. Deferred actions are executed in reverse order of how they are + specified—that is, the code in the first defer statement executes after code in the second, and so on. + + You can use a defer statement even when no error handling code is involved. + */ + diff --git a/17_Error_Handling.playground/contents.xcplayground b/18_Error_Handling.playground/contents.xcplayground similarity index 100% rename from 17_Error_Handling.playground/contents.xcplayground rename to 18_Error_Handling.playground/contents.xcplayground diff --git a/18_Type Casting copy.playground/Contents.swift b/18_Type Casting copy.playground/Contents.swift deleted file mode 100644 index 527e5c3..0000000 --- a/18_Type Casting copy.playground/Contents.swift +++ /dev/null @@ -1,197 +0,0 @@ - -// |=------------------------------------------------------=| -// Copyright (c) 2016 Juan Antonio Karmy. -// Licensed under MIT License -// -// See https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ for Swift Language Reference -// -// See Juan Antonio Karmy - http://karmy.co | http://twitter.com/jkarmy -// -// |=------------------------------------------------------=| - - -import UIKit - -/* -=========================================== -Defining a Class Hierarchy for Type Casting -=========================================== -*/ - -class MediaItem { - var name: String - init(name: String) { - self.name = name - } -} - -class Movie: MediaItem { - var director: String - init(name: String, director: String) { - self.director = director - super.init(name: name) - } -} - -class Song: MediaItem { - var artist: String - init(name: String, artist: String) { - self.artist = artist - super.init(name: name) - } -} - -let library = [ - Movie(name: "Casablanca", director: "Michael Curtiz"), - Song(name: "Blue Suede Shoes", artist: "Elvis Presley"), - Movie(name: "Citizen Kane", director: "Orson Welles"), - Song(name: "The One And Only", artist: "Chesney Hawkes"), - Song(name: "Never Gonna Give You Up", artist: "Rick Astley") -] - -/* -The type of the library array is inferred by initializing it with the contents of an array literal. -Swift’s type checker is able to deduce that Movie and Song have a common superclass of MediaItem, -and so it infers a type of [MediaItem] for the library array. - -The items stored in library are still Movie and Song instances behind the scenes. -However, if you iterate over the contents of this array, the items you receive back are typed as MediaItem, -and not as Movie or Song. In order to work with them as their native type, you need to check their type, -or downcast them to a different type, as described below. -*/ - - -/* -============= -Checking Type -============= -*/ - -/* -Use the type check operator (is) to check whether an instance is of a certain subclass type. -*/ - -var movieCount = 0 -var songCount = 0 - -for item in library { - if item is Movie { - movieCount += 1 - } else if item is Song { - songCount += 1 - } -} - -print("Media library contains \(movieCount) movies and \(songCount) songs") -// Prints "Media library contains 2 movies and 3 songs" - - -/* -=========== -Downcasting -=========== -*/ - -/* -A constant or variable of a certain class type may actually refer to an instance of a subclass behind the scenes. -Where you believe this is the case, you can try to downcast to the subclass type with a type cast operator (as? or as!). - -Because downcasting can fail, the type cast operator comes in two different forms. The conditional form, as?, returns -an optional value of the type you are trying to downcast to. The forced form, as!, attempts the downcast and force-unwraps -the result as a single compound action. -*/ - - -for item in library { - if let movie = item as? Movie { - print("Movie: '\(movie.name)', dir. \(movie.director)") - } else if let song = item as? Song { - print("Song: '\(song.name)', by \(song.artist)") - } -} - -// Note that "let mediaItem = movie as MediaItem" will always work. That's why you don't need to use neither the conditional form -// or the forced form. - - -/* -================================== -Type Casting for Any and AnyObject -================================== -*/ - -/* -Swift provides two special type aliases for working with non-specific types: - - AnyObject can represent an instance of any class type. - Any can represent an instance of any type at all, including function types. -*/ - - -/* -========= -AnyObject -========= -*/ - - -let someObjects: [AnyObject] = [ - Movie(name: "2001: A Space Odyssey", director: "Stanley Kubrick"), - Movie(name: "Moon", director: "Duncan Jones"), - Movie(name: "Alien", director: "Ridley Scott") -] - -for movie in someObjects as! [Movie] { - print("Movie: '\(movie.name)', dir. \(movie.director)") -} - - -/* -=== -Any -=== -*/ - - -var things = [Any]() - -things.append(0) -things.append(0.0) -things.append(42) -things.append(3.14159) -things.append("hello") -things.append((3.0, 5.0)) -things.append(Movie(name: "Ghostbusters", director: "Ivan Reitman")) -things.append({ (name: String) -> String in "Hello, \(name)" }) - - -/* -You can use the is and as operators in a switch statement’s cases to discover the specific type of a constant or variable -that is known only to be of type Any or AnyObject. -*/ - - -for thing in things { - switch thing { - case 0 as Int: - print("zero as an Int") - case 0 as Double: - print("zero as a Double") - case let someInt as Int: - print("an integer value of \(someInt)") - case let someDouble as Double where someDouble > 0: - print("a positive double value of \(someDouble)") - case is Double: // Here it's valid to use is, since the only thing being queried is the type. Other case statements store values in vars, so they use as. - print("some other double value that I don't want to print") - case let someString as String: - print("a string value of \"\(someString)\"") - case let (x, y) as (Double, Double): - print("an (x, y) point at \(x), \(y)") - case let movie as Movie: - print("a movie called '\(movie.name)', dir. \(movie.director)") - case let stringConverter as String -> String: - print(stringConverter("Michael")) - default: - print("something else") - } -} diff --git a/18_Type Casting copy.playground/playground.xcworkspace/contents.xcworkspacedata b/18_Type Casting copy.playground/playground.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a..0000000 --- a/18_Type Casting copy.playground/playground.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/18_Type Casting copy.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate b/18_Type Casting copy.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index 2aad58b951fe367f76104af214b2cdea7ab399b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15810 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 O;awya-owA0xBMS9-|EKz diff --git a/18_Type Casting copy.playground/playground.xcworkspace/xcuserdata/nhat.tien.xcuserdatad/UserInterfaceState.xcuserstate b/18_Type Casting copy.playground/playground.xcworkspace/xcuserdata/nhat.tien.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index 975437e134de3484dddaf48e3cf7bc5ae6bb52ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7170 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 diff --git a/19_Type Casting copy.playground/Contents.swift b/19_Type Casting copy.playground/Contents.swift new file mode 100644 index 0000000..c6ce2c0 --- /dev/null +++ b/19_Type Casting copy.playground/Contents.swift @@ -0,0 +1,197 @@ + +// |=------------------------------------------------------=| +// Copyright (c) 2016 Juan Antonio Karmy. +// Licensed under MIT License +// +// See https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ for Swift Language Reference +// +// See Juan Antonio Karmy - http://karmy.co | http://twitter.com/jkarmy +// +// |=------------------------------------------------------=| + + +import UIKit + +/* + =========================================== + Defining a Class Hierarchy for Type Casting + =========================================== + */ + +class MediaItem { + var name: String + init(name: String) { + self.name = name + } +} + +class Movie: MediaItem { + var director: String + init(name: String, director: String) { + self.director = director + super.init(name: name) + } +} + +class Song: MediaItem { + var artist: String + init(name: String, artist: String) { + self.artist = artist + super.init(name: name) + } +} + +let library = [ + Movie(name: "Casablanca", director: "Michael Curtiz"), + Song(name: "Blue Suede Shoes", artist: "Elvis Presley"), + Movie(name: "Citizen Kane", director: "Orson Welles"), + Song(name: "The One And Only", artist: "Chesney Hawkes"), + Song(name: "Never Gonna Give You Up", artist: "Rick Astley") +] + +/* + The type of the library array is inferred by initializing it with the contents of an array literal. + Swift’s type checker is able to deduce that Movie and Song have a common superclass of MediaItem, + and so it infers a type of [MediaItem] for the library array. + + The items stored in library are still Movie and Song instances behind the scenes. + However, if you iterate over the contents of this array, the items you receive back are typed as MediaItem, + and not as Movie or Song. In order to work with them as their native type, you need to check their type, + or downcast them to a different type, as described below. + */ + + +/* + ============= + Checking Type + ============= + */ + +/* + Use the type check operator (is) to check whether an instance is of a certain subclass type. + */ + +var movieCount = 0 +var songCount = 0 + +for item in library { + if item is Movie { + movieCount += 1 + } else if item is Song { + songCount += 1 + } +} + +print("Media library contains \(movieCount) movies and \(songCount) songs") +// Prints "Media library contains 2 movies and 3 songs" + + +/* + =========== + Downcasting + =========== + */ + +/* + A constant or variable of a certain class type may actually refer to an instance of a subclass behind the scenes. + Where you believe this is the case, you can try to downcast to the subclass type with a type cast operator (as? or as!). + + Because downcasting can fail, the type cast operator comes in two different forms. The conditional form, as?, returns + an optional value of the type you are trying to downcast to. The forced form, as!, attempts the downcast and force-unwraps + the result as a single compound action. + */ + + +for item in library { + if let movie = item as? Movie { + print("Movie: '\(movie.name)', dir. \(movie.director)") + } else if let song = item as? Song { + print("Song: '\(song.name)', by \(song.artist)") + } +} + +// Note that "let mediaItem = movie as MediaItem" will always work. That's why you don't need to use neither the conditional form +// or the forced form. + + +/* + ================================== + Type Casting for Any and AnyObject + ================================== + */ + +/* + Swift provides two special type aliases for working with non-specific types: + + AnyObject can represent an instance of any class type. + Any can represent an instance of any type at all, including function types. + */ + + +/* + ========= + AnyObject + ========= + */ + + +let someObjects: [AnyObject] = [ + Movie(name: "2001: A Space Odyssey", director: "Stanley Kubrick"), + Movie(name: "Moon", director: "Duncan Jones"), + Movie(name: "Alien", director: "Ridley Scott") +] + +for movie in someObjects as! [Movie] { + print("Movie: '\(movie.name)', dir. \(movie.director)") +} + + +/* + === + Any + === + */ + + +var things = [Any]() + +things.append(0) +things.append(0.0) +things.append(42) +things.append(3.14159) +things.append("hello") +things.append((3.0, 5.0)) +things.append(Movie(name: "Ghostbusters", director: "Ivan Reitman")) +things.append({ (name: String) -> String in "Hello, \(name)" }) + + +/* + You can use the is and as operators in a switch statement’s cases to discover the specific type of a constant or variable + that is known only to be of type Any or AnyObject. + */ + + +for thing in things { + switch thing { + case 0 as Int: + print("zero as an Int") + case 0 as Double: + print("zero as a Double") + case let someInt as Int: + print("an integer value of \(someInt)") + case let someDouble as Double where someDouble > 0: + print("a positive double value of \(someDouble)") + case is Double: // Here it's valid to use is, since the only thing being queried is the type. Other case statements store values in vars, so they use as. + print("some other double value that I don't want to print") + case let someString as String: + print("a string value of \"\(someString)\"") + case let (x, y) as (Double, Double): + print("an (x, y) point at \(x), \(y)") + case let movie as Movie: + print("a movie called '\(movie.name)', dir. \(movie.director)") + case let stringConverter as (String) -> String: + print(stringConverter("Michael")) + default: + print("something else") + } +} diff --git a/18_Type Casting copy.playground/contents.xcplayground b/19_Type Casting copy.playground/contents.xcplayground similarity index 100% rename from 18_Type Casting copy.playground/contents.xcplayground rename to 19_Type Casting copy.playground/contents.xcplayground diff --git a/20_Extensions.playground/Contents.swift.orig b/20_Extensions.playground/Contents.swift.orig deleted file mode 100644 index 43ad005..0000000 --- a/20_Extensions.playground/Contents.swift.orig +++ /dev/null @@ -1,201 +0,0 @@ - -// |=------------------------------------------------------=| -// Copyright (c) 2016 Juan Antonio Karmy. -// Licensed under MIT License -// -// See https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ for Swift Language Reference -// -// See Juan Antonio Karmy - http://karmy.co | http://twitter.com/jkarmy -// -// |=------------------------------------------------------=| - - -import UIKit - -/* -Extensions add new functionality to an existing class, structure, enumeration, or protocol type. -Extensions can add new functionality to a type, but they cannot override existing functionality. -*/ - - -/* -================ -Extension Syntax -================ -*/ - -extension Int/*: SomeProtocol, AnotherProtocol*/ { - // new functionality to add to SomeType goes here - // implementation of protocol requirements goes here -} - -/* -If you define an extension to add new functionality to an existing type, the new functionality will be -available on all existing instances of that type, even if they were created before the extension was defined. -*/ - - -/* -=================== -Computed Properties -=================== -*/ - -// Extensions can add computed instance properties and computed type properties to existing types. - -extension Double { - var km: Double { return self * 1_000.0 } - var m: Double { return self } - var cm: Double { return self / 100.0 } - var mm: Double { return self / 1_000.0 } - var ft: Double { return self / 3.28084 } -} - -let oneInch = 25.4.mm -print("One inch is \(oneInch) meters") -// prints "One inch is 0.0254 meters" -let threeFeet = 3.ft -print("Three feet is \(threeFeet) meters") -// prints "Three feet is 0.914399970739201 meters" - -/* -Extensions can add new computed properties, but they cannot add stored properties, -or add property observers to existing properties. -*/ - - -/* -============ -Initializers -============ -*/ - -/* -Extensions can add new initializers to existing types. This enables you to extend other types to accept -your own custom types as initializer parameters, or to provide additional initialization options that were not -included as part of the type’s original implementation. - -Extensions can add new convenience initializers to a class, but they cannot add new designated initializers or deinitializers -to a class. Designated initializers and deinitializers must always be provided by the original class implementation. -*/ - -struct Size { - var width = 0.0, height = 0.0 -} -struct Point { - var x = 0.0, y = 0.0 -} -struct Rect { - var origin = Point() - var size = Size() -} - -let defaultRect = Rect() -let memberwiseRect = Rect(origin: Point(x: 2.0, y: 2.0), - size: Size(width: 5.0, height: 5.0)) - - -extension Rect { - init(center: Point, size: Size) { - let originX = center.x - (size.width / 2) - let originY = center.y - (size.height / 2) - self.init(origin: Point(x: originX, y: originY), size: size) - } -} - -let centerRect = Rect(center: Point(x: 4.0, y: 4.0), - size: Size(width: 3.0, height: 3.0)) -// centerRect's origin is (2.5, 2.5) and its size is (3.0, 3.0) - - -/* -If you provide a new initializer with an extension, you are still responsible for making sure that -each instance is fully initialized once the initializer completes. -*/ - - -/* -======= -Methods -======= -*/ - - -/* -Extensions can add new instance methods and type methods to existing types. -The following example adds a new instance method called repetitions to the Int type: -*/ - -extension Int { - func repetitions(task: () -> Void) { - for _ in 0.. Void, which indicates a -function that has no parameters and does not return a value. -*/ - -3.repetitions { - print("Goodbye!") -} - - -/* -========================= -Mutating Instance Methods -========================= -*/ - -/* -Structure and enumeration methods that modify self or its properties must mark the -instance method as mutating, just like mutating methods from an original implementation. -*/ - -extension Int { - mutating func square() { - self = self * self - } -} -var someInt = 3 -someInt.square() -// someInt is now 9 - - -/* -========== -Subscripts -========== -*/ - -extension Int { - subscript(digitIndex: Int) -> Int { -<<<<<<< HEAD - var digitIndex = digitIndex -======= - var index = digitIndex ->>>>>>> a95249d306c181ad7bd6b22b803217e9f653f0c8 - var decimalBase = 1 - while index > 0 { - decimalBase *= 10 -<<<<<<< HEAD - digitIndex -= 1 -======= - index -= 1 ->>>>>>> a95249d306c181ad7bd6b22b803217e9f653f0c8 - } - return (self / decimalBase) % 10 - } -} - -746381295[0] -// returns 5 -746381295[1] -// returns 9 -746381295[2] -// returns 2 -746381295[8] -// returns 7 diff --git a/20_Extensions.playground/playground.xcworkspace/contents.xcworkspacedata b/20_Extensions.playground/playground.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a..0000000 --- a/20_Extensions.playground/playground.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/20_Extensions.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate b/20_Extensions.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index f4120d3839b668691e995fcfd11eba0f08b72292..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16066 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 B Void) { @@ -135,9 +135,9 @@ extension Int { } /* -The repetitions(_:) method takes a single argument of type () -> Void, which indicates a -function that has no parameters and does not return a value. -*/ + The repetitions(_:) method takes a single argument of type () -> Void, which indicates a + function that has no parameters and does not return a value. + */ 3.repetitions { print("Goodbye!") @@ -145,15 +145,15 @@ function that has no parameters and does not return a value. /* -========================= -Mutating Instance Methods -========================= -*/ + ========================= + Mutating Instance Methods + ========================= + */ /* -Structure and enumeration methods that modify self or its properties must mark the -instance method as mutating, just like mutating methods from an original implementation. -*/ + Structure and enumeration methods that modify self or its properties must mark the + instance method as mutating, just like mutating methods from an original implementation. + */ extension Int { mutating func square() { @@ -166,10 +166,10 @@ someInt.square() /* -========== -Subscripts -========== -*/ + ========== + Subscripts + ========== + */ extension Int { subscript(digitIndex: Int) -> Int { diff --git a/20_Extensions.playground/contents.xcplayground b/21_Extensions.playground/contents.xcplayground similarity index 100% rename from 20_Extensions.playground/contents.xcplayground rename to 21_Extensions.playground/contents.xcplayground diff --git a/21_Protocols.playground/playground.xcworkspace/contents.xcworkspacedata b/21_Protocols.playground/playground.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a..0000000 --- a/21_Protocols.playground/playground.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/21_Protocols.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate b/21_Protocols.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index a0d580c3aa99670c0d4f8bceef54e789e7072f2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16739 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 diff --git a/22_Generics.playground/Contents.swift b/22_Generics.playground/Contents.swift deleted file mode 100644 index 9fbf88d..0000000 --- a/22_Generics.playground/Contents.swift +++ /dev/null @@ -1,248 +0,0 @@ - -// |=------------------------------------------------------=| -// Copyright (c) 2016 Juan Antonio Karmy. -// Licensed under MIT License -// -// See https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ for Swift Language Reference -// -// See Juan Antonio Karmy - http://karmy.co | http://twitter.com/jkarmy -// -// |=------------------------------------------------------=| - - -import UIKit - -/* -================= -Generic Functions -================= -*/ - -// Basic example - -func swapTwoValues(inout a: T, inout _ b: T) { - let temporaryA = a - a = b - b = temporaryA -} - -var someInt = 3 -var anotherInt = 107 -swapTwoValues(&someInt, &anotherInt) -// someInt is now 107, and anotherInt is now 3 - -var someString = "hello" -var anotherString = "world" -swapTwoValues(&someString, &anotherString) -// someString is now "world", and anotherString is now "hello" - -/* -The swapTwoValues(_:_:) function defined above is inspired by a generic function called swap, -which is part of the Swift standard library, and is automatically made available for you to use in your apps. -If you need the behavior of the swapTwoValues(_:_:) function in your own code, you can use Swift’s -existing swap(_:_:) function rather than providing your own implementation. -*/ - -/*You can provide more than one type parameter by writing multiple type parameter names within the angle brackets, separated by commas.*/ - -/* -====================== -Naming Type Parameters -====================== -*/ - -/* -In most cases, type parameters have descriptive names, such as Key and Value in Dictionary -and Element in Array, which tells the reader about the relationship between the type parameter -and the generic type or function it’s used in. However, when there isn’t a meaningful relationship between them, -it’s traditional to name them using single letters such as T, U, and V, such as T in the swapTwoValues(_:_:) function above. -*/ - -/* -NOTE - -Always give type parameters upper camel case names (such as T and MyTypeParameter) to indicate -that they are a placeholder for a type, not a value. -*/ - - -/* -============= -Generic Types -============= -*/ - -/* -Swift enables you to define your own generic types. These are custom classes, structures, -and enumerations that can work with any type, in a similar way to Array and Dictionary. -*/ - -struct Stack { - var items = [Element]() - mutating func push(item: Element) { - items.append(item) - } - mutating func pop() -> Element { - return items.removeLast() - } -} - -/* -Note how the generic version of Stack is essentially the same as the non-generic version, -but with a type parameter called Element instead of an actual type of Int. -This type parameter is written within a pair of angle brackets () immediately after the structure’s name. - -Element defines a placeholder name for “some type Element” to be provided later on. -This future type can be referred to as “Element” anywhere within the structure’s definition. -*/ - -var stackOfStrings = Stack() -stackOfStrings.push("uno") -stackOfStrings.push("dos") -stackOfStrings.push("tres") -stackOfStrings.push("cuatro") -// the stack now contains 4 strings - - -/* -======================== -Extending a Generic Type -======================== -*/ - -/* -When you extend a generic type, you do not provide a type parameter list as part of the extension’s definition. -Instead, the type parameter list from the original type definition is available within the body of the extension, -and the original type parameter names are used to refer to the type parameters from the original definition. -*/ - -extension Stack { - var topItem: Element? { - return items.isEmpty ? nil : items[items.count - 1] - } -} - -/* -Note that this extension does not define a type parameter list. -Instead, the Stack type’s existing type parameter name, Element, -is used within the extension to indicate the optional type of the topItem computed property. -*/ - - -/* -================ -Type Constraints -================ -*/ - -protocol SomeProtocol { - -} - -class SomeClass { - -} - -func someFunction(someT: T, someU: U) { - // function body goes here -} - -/* -The hypothetical function above has two type parameters. The first type parameter, T, -has a type constraint that requires T to be a subclass of SomeClass. -The second type parameter, U, has a type constraint that requires U to conform to the protocol SomeProtocol. -*/ - -// Example -func findIndex(array: [T], _ valueToFind: T) -> Int? { - for (index, value) in array.enumerate() { - if value == valueToFind { - return index - } - } - return nil -} - -/* -================ -Associated Types -================ -*/ - -/* -The Container protocol needs a way to refer to the type of the elements that a container will hold, -without knowing what that type is for a specific container. -*/ - -protocol Container { - associatedtype ItemType - mutating func append(item: ItemType) - var count: Int { get } - subscript(i: Int) -> ItemType { get } -} - -struct OtherStack: Container { - // original Stack implementation - var items = [Element]() - mutating func push(item: Element) { - items.append(item) - } - mutating func pop() -> Element { - return items.removeLast() - } - // conformance to the Container protocol - mutating func append(item: Element) { - self.push(item) - } - var count: Int { - return items.count - } - subscript(i: Int) -> Element { - return items[i] - } -} - -/* -Thanks to Swift’s type inference, you don’t actually need to declare a concrete ItemType of Int as part of the definition of IntStack. -Because IntStack conforms to all of the requirements of the Container protocol, Swift can infer the appropriate ItemType to use, -simply by looking at the type of the append(_:) method’s item parameter and the return type of the subscript. -Indeed, if you delete the typealias ItemType = Int line from the code above, -everything still works, because it is clear what type should be used for ItemType. -*/ - -// You can extend an existing type to add conformance to a protocol. - -extension Array: Container {} - -/* -================ -Associated Types -================ -*/ - -func allItemsMatch< - C1: Container, C2: Container - where C1.ItemType == C2.ItemType, C1.ItemType: Equatable> - (someContainer: C1, _ anotherContainer: C2) -> Bool { - - // check that both containers contain the same number of items - if someContainer.count != anotherContainer.count { - return false - } - - // check each pair of items to see if they are equivalent - for i in 0.. - - - - diff --git a/22_Generics.playground/Resources/21_Protocols.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate b/22_Generics.playground/Resources/21_Protocols.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index d310f58b7caaccd735f83c46d182251a307f3db0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17091 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 - - - - diff --git a/22_Generics.playground/playground.xcworkspace/contents.xcworkspacedata b/22_Generics.playground/playground.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a..0000000 --- a/22_Generics.playground/playground.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/22_Generics.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate b/22_Generics.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index 115d52bfe7b5a234ae33b4bef7f61325cbf81313..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17410 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 P!wA1wr|{eVGe`bEmhOUb diff --git a/21_Protocols.playground/Contents.swift b/22_Protocols.playground/Contents.swift similarity index 50% rename from 21_Protocols.playground/Contents.swift rename to 22_Protocols.playground/Contents.swift index 8e9c3a1..0c8c9e9 100644 --- a/21_Protocols.playground/Contents.swift +++ b/22_Protocols.playground/Contents.swift @@ -13,10 +13,10 @@ import UIKit /* -=============== -Protocol Syntax -=============== -*/ + =============== + Protocol Syntax + =============== + */ protocol SomeProtocol { // protocol definition goes here @@ -36,15 +36,15 @@ class SomeClass: SomeSuperclass, SomeProtocol, AnotherProtocol { } /* -===================== -Property Requirements -===================== -*/ + ===================== + Property Requirements + ===================== + */ /* If a protocol requires a property to be gettable and settable, that property requirement cannot be -fulfilled by a constant stored property or a read-only computed property. If the protocol only requires a property to be gettable, -the requirement can be satisfied by any kind of property, and it is valid for the property to be also settable if this is useful for your own code. -*/ + fulfilled by a constant stored property or a read-only computed property. If the protocol only requires a property to be gettable, + the requirement can be satisfied by any kind of property, and it is valid for the property to be also settable if this is useful for your own code. + */ protocol SomeOtherProtocol { var mustBeSettable: Int { get set } @@ -78,10 +78,10 @@ var ncc1701 = Starship(name: "Enterprise", prefix: "USS") /* -=================== -Method Requirements -=================== -*/ + =================== + Method Requirements + =================== + */ protocol RandomNumberGenerator { func random() -> Double @@ -89,11 +89,11 @@ protocol RandomNumberGenerator { class LinearCongruentialGenerator: RandomNumberGenerator { var lastRandom = 42.0 - let m = 139968.0 - let a = 3877.0 - let c = 29573.0 + let m = 139_968.0 + let a = 3_877.0 + let c = 29_573.0 func random() -> Double { - lastRandom = ((lastRandom * a + c) % m) + lastRandom = ((lastRandom * a + c) .truncatingRemainder(dividingBy: m)) return lastRandom / m } } @@ -105,21 +105,21 @@ print("And another one: \(generator.random())") /* -============================ -Mutating Method Requirements -============================ -*/ + ============================ + Mutating Method Requirements + ============================ + */ /* -If you define a protocol instance method requirement that is intended to mutate instances -of any type that adopts the protocol, mark the method with the mutating keyword as part -of the protocol’s definition. This enables structures and enumerations to adopt the protocol and satisfy that method requirement. - -NOTE -If you mark a protocol instance method requirement as mutating, you do not need to -write the mutating keyword when writing an implementation of that method for a class. -The mutating keyword is only used by structures and enumerations. -*/ + If you define a protocol instance method requirement that is intended to mutate instances + of any type that adopts the protocol, mark the method with the mutating keyword as part + of the protocol’s definition. This enables structures and enumerations to adopt the protocol and satisfy that method requirement. + + NOTE + If you mark a protocol instance method requirement as mutating, you do not need to + write the mutating keyword when writing an implementation of that method for a class. + The mutating keyword is only used by structures and enumerations. + */ protocol Togglable { mutating func toggle() @@ -142,19 +142,19 @@ lightSwitch.toggle() /* -======================== -Initializer Requirements -======================== -*/ + ======================== + Initializer Requirements + ======================== + */ protocol SomeNewProtocol { init(someParameter: Int) } /* -You can implement a protocol initializer requirement on a conforming class as either a designated initializer -or a convenience initializer. In both cases, you must mark the initializer implementation with the required modifier: -*/ + You can implement a protocol initializer requirement on a conforming class as either a designated initializer + or a convenience initializer. In both cases, you must mark the initializer implementation with the required modifier: + */ class SomeNewClass: SomeNewProtocol { required init(someParameter: Int) { @@ -163,10 +163,10 @@ class SomeNewClass: SomeNewProtocol { } /* -NOTE -You do not need to mark protocol initializer implementations with the required modifier on classes -that are marked with the final modifier, because final classes cannot be subclassed. For more on the final modifier, see Preventing Overrides. -*/ + NOTE + You do not need to mark protocol initializer implementations with the required modifier on classes + that are marked with the final modifier, because final classes cannot be subclassed. For more on the final modifier, see Preventing Overrides. + */ class SomeSuperClass { init() { @@ -183,21 +183,21 @@ class SomeSubClass: SomeSuperClass, SomeProtocol { /* -================== -Protocols as Types -================== -*/ + ================== + Protocols as Types + ================== + */ /* -Because it is a type, you can use a protocol in many places where other types are allowed, including: - -- As a parameter type or return type in a function, method, or initializer -- As the type of a constant, variable, or property -- As the type of items in an array, dictionary, or other container - -NOTE -Because protocols are types, begin their names with a capital letter (such as FullyNamed and RandomNumberGenerator) to match the names of other types in Swift (such as Int, String, and Double). -*/ + Because it is a type, you can use a protocol in many places where other types are allowed, including: + + - As a parameter type or return type in a function, method, or initializer + - As the type of a constant, variable, or property + - As the type of items in an array, dictionary, or other container + + NOTE + Because protocols are types, begin their names with a capital letter (such as FullyNamed and RandomNumberGenerator) to match the names of other types in Swift (such as Int, String, and Double). + */ class Dice { let sides: Int @@ -223,10 +223,10 @@ for _ in 1...5 { /* -========== -Delegation -========== -*/ + ========== + Delegation + ========== + */ protocol DiceGame { var dice: Dice { get } @@ -244,17 +244,17 @@ class SnakesAndLadders: DiceGame { var square = 0 var board: [Int] init() { - board = [Int](count: finalSquare + 1, repeatedValue: 0) + board = [Int](repeating: 0, count: finalSquare + 1) board[03] = +08; board[06] = +11; board[09] = +09; board[10] = +02 board[14] = -10; board[19] = -11; board[22] = -02; board[24] = -08 } var delegate: DiceGameDelegate? func play() { square = 0 - delegate?.gameDidStart(self) + delegate?.gameDidStart(game: self) gameLoop: while square != finalSquare { let diceRoll = dice.roll() - delegate?.game(self, didStartNewTurnWithDiceRoll: diceRoll) + delegate?.game(game: self, didStartNewTurnWithDiceRoll: diceRoll) switch square + diceRoll { case finalSquare: break gameLoop @@ -265,15 +265,15 @@ class SnakesAndLadders: DiceGame { square += board[square] } } - delegate?.gameDidEnd(self) + delegate?.gameDidEnd(game: self) } } /* -Note that the delegate property is defined as an optional DiceGameDelegate, -because a delegate isn’t required in order to play the game. Because it is of an optional type, -the delegate property is automatically set to an initial value of nil. Thereafter, the game instantiator has the option to set the property to a suitable delegate. -*/ + Note that the delegate property is defined as an optional DiceGameDelegate, + because a delegate isn’t required in order to play the game. Because it is of an optional type, + the delegate property is automatically set to an initial value of nil. Thereafter, the game instantiator has the option to set the property to a suitable delegate. + */ class DiceGameTracker: DiceGameDelegate { var numberOfTurns = 0 @@ -301,18 +301,18 @@ game.delegate = tracker game.play() /* -============================================= -Adding Protocol Conformance with an Extension -============================================= -*/ + ============================================= + Adding Protocol Conformance with an Extension + ============================================= + */ /* -You can extend an existing type to adopt and conform to a new protocol, -even if you do not have access to the source code for the existing type. -Extensions can add new properties, methods, and subscripts to an existing type, -and are therefore able to add any requirements that a protocol may demand -*/ + You can extend an existing type to adopt and conform to a new protocol, + even if you do not have access to the source code for the existing type. + Extensions can add new properties, methods, and subscripts to an existing type, + and are therefore able to add any requirements that a protocol may demand + */ protocol TextRepresentable { var textualDescription: String { get } @@ -350,10 +350,10 @@ for thing in things { /* -==================== -Protocol Inheritance -==================== -*/ + ==================== + Protocol Inheritance + ==================== + */ protocol PrettyTextRepresentable: TextRepresentable { var prettyTextualDescription: String { get } @@ -383,22 +383,22 @@ extension SnakesAndLadders: PrettyTextRepresentable { } /* -This example defines a new protocol, PrettyTextRepresentable, which inherits from TextRepresentable. -Anything that adopts PrettyTextRepresentable must satisfy all of the requirements enforced by TextRepresentable, -plus the additional requirements enforced by PrettyTextRepresentable. -*/ + This example defines a new protocol, PrettyTextRepresentable, which inherits from TextRepresentable. + Anything that adopts PrettyTextRepresentable must satisfy all of the requirements enforced by TextRepresentable, + plus the additional requirements enforced by PrettyTextRepresentable. + */ /* -==================== -Class-Only Protocols -==================== -*/ + ==================== + Class-Only Protocols + ==================== + */ /* -You can limit protocol adoption to class types (and not structures or enumerations) by adding the class keyword -to a protocol’s inheritance list. The class keyword must always appear first in a protocol’s inheritance list, before any inherited protocols -*/ + You can limit protocol adoption to class types (and not structures or enumerations) by adding the class keyword + to a protocol’s inheritance list. The class keyword must always appear first in a protocol’s inheritance list, before any inherited protocols + */ protocol SomeInheritedProtocol {} @@ -407,17 +407,17 @@ protocol SomeClassOnlyProtocol: class, SomeInheritedProtocol { } /* -==================== -Protocol Composition -==================== -*/ + ==================== + Protocol Composition + ==================== + */ /* -It can be useful to require a type to conform to multiple protocols at once. -You can combine multiple protocols into a single requirement with a protocol composition. -Protocol compositions have the form protocol. -You can list as many protocols within the pair of angle brackets (<>) as you need, separated by commas. -*/ + It can be useful to require a type to conform to multiple protocols at once. + You can combine multiple protocols into a single requirement with a protocol composition. + Protocol compositions have the form protocol. + You can list as many protocols within the pair of angle brackets (<>) as you need, separated by commas. + */ protocol Named { var name: String { get } @@ -433,70 +433,70 @@ func wishHappyBirthday(celebrator: protocol) { print("Happy birthday \(celebrator.name) - you're \(celebrator.age)!") } let birthdayPerson = Personn(name: "Malcolm", age: 21) -wishHappyBirthday(birthdayPerson) +wishHappyBirthday(celebrator: birthdayPerson) // prints "Happy birthday Malcolm - you're 21!" /* -NOTE - -Protocol compositions do not define a new, permanent protocol type. -Rather, they define a temporary local protocol that has the combined requirements of all protocols in the composition. -*/ + NOTE + + Protocol compositions do not define a new, permanent protocol type. + Rather, they define a temporary local protocol that has the combined requirements of all protocols in the composition. + */ /* -================================= -Checking for Protocol Conformance -================================= -*/ + ================================= + Checking for Protocol Conformance + ================================= + */ /* -You can use the is and as operators described in Type Casting to check for protocol conformance, -and to cast to a specific protocol. Checking for and casting to a protocol follows exactly the same syntax -as checking for and casting to a type: - -• The is operator returns true if an instance conforms to a protocol and returns false if it does not. -• The as? version of the downcast operator returns an optional value of the protocol’s type, and this value is nil if the instance does not conform to that protocol. -• The as! version of the downcast operator forces the downcast to the protocol type and triggers a runtime error if the downcast does not succeed. -*/ + You can use the is and as operators described in Type Casting to check for protocol conformance, + and to cast to a specific protocol. Checking for and casting to a protocol follows exactly the same syntax + as checking for and casting to a type: + + • The is operator returns true if an instance conforms to a protocol and returns false if it does not. + • The as? version of the downcast operator returns an optional value of the protocol’s type, and this value is nil if the instance does not conform to that protocol. + • The as! version of the downcast operator forces the downcast to the protocol type and triggers a runtime error if the downcast does not succeed. + */ /* -============================== -Optional Protocol Requirements -============================== -*/ + ============================== + Optional Protocol Requirements + ============================== + */ /* -Optional requirements are prefixed by the optional modifier as part of the protocol’s definition. -When you use a method or property in an optional requirement, its type automatically becomes an optional. -For example, a method of type (Int) -> String becomes ((Int) -> String)?. Note that the entire function type is wrapped in the optional, not method’s the return value. - -You check for an implementation of an optional method by writing a question mark after the name of the method when it is called, such as someOptionalMethod?(someArgument). - - -NOTE - -Optional protocol requirements can only be specified if your protocol is marked with the @objc attribute. - -This attribute indicates that the protocol should be exposed to Objective-C code and is described in -Using Swift with Cocoa and Objective-C (Swift 2.1). Even if you are not interoperating with Objective-C, -you need to mark your protocols with the @objc attribute if you want to specify optional requirements. - -Note also that @objc protocols can be adopted only by classes that inherit from -Objective-C classes or other @objc classes. They can’t be adopted by structures or enumerations. -*/ + Optional requirements are prefixed by the optional modifier as part of the protocol’s definition. + When you use a method or property in an optional requirement, its type automatically becomes an optional. + For example, a method of type (Int) -> String becomes ((Int) -> String)?. Note that the entire function type is wrapped in the optional, not method’s the return value. + + You check for an implementation of an optional method by writing a question mark after the name of the method when it is called, such as someOptionalMethod?(someArgument). + + + NOTE + + Optional protocol requirements can only be specified if your protocol is marked with the @objc attribute. + + This attribute indicates that the protocol should be exposed to Objective-C code and is described in + Using Swift with Cocoa and Objective-C (Swift 2.1). Even if you are not interoperating with Objective-C, + you need to mark your protocols with the @objc attribute if you want to specify optional requirements. + + Note also that @objc protocols can be adopted only by classes that inherit from + Objective-C classes or other @objc classes. They can’t be adopted by structures or enumerations. + */ @objc protocol CounterDataSource { - optional func incrementForCount(count: Int) -> Int - optional var fixedIncrement: Int { get } + @objc optional func incrementForCount(count: Int) -> Int + @objc optional var fixedIncrement: Int { get } } class Counter { var count = 0 var dataSource: CounterDataSource? func increment() { - if let amount = dataSource?.incrementForCount?(count) { + if let amount = dataSource?.incrementForCount?(count: count) { count += amount } else if let amount = dataSource?.fixedIncrement { count += amount @@ -505,17 +505,17 @@ class Counter { } /* -Because the call to incrementForCount(_:) can fail for either of these two reasons, -the call returns an optional Int value. This is true even though incrementForCount(_:) -is defined as returning a nonoptional Int value in the definition of CounterDataSource. -*/ + Because the call to incrementForCount(_:) can fail for either of these two reasons, + the call returns an optional Int value. This is true even though incrementForCount(_:) + is defined as returning a nonoptional Int value in the definition of CounterDataSource. + */ /* -=================== -Protocol Extensions -=================== -*/ + =================== + Protocol Extensions + =================== + */ extension RandomNumberGenerator { func randomBool() -> Bool { @@ -533,27 +533,27 @@ print("And here's a random Boolean: \(generator.randomBool())") /* -You can use protocol extensions to provide a default implementation to any method or property requirement of that protocol. -If a conforming type provides its own implementation of a required method or property, -that implementation will be used instead of the one provided by the extension. - -NOTE - -Protocol requirements with default implementations provided by extensions are distinct from optional protocol requirements. -Although conforming types don’t have to provide their own implementation of either, -requirements with default implementations can be called without optional chaining. -*/ + You can use protocol extensions to provide a default implementation to any method or property requirement of that protocol. + If a conforming type provides its own implementation of a required method or property, + that implementation will be used instead of the one provided by the extension. + + NOTE + + Protocol requirements with default implementations provided by extensions are distinct from optional protocol requirements. + Although conforming types don’t have to provide their own implementation of either, + requirements with default implementations can be called without optional chaining. + */ /* -When you define a protocol extension, you can specify constraints that conforming types must satisfy -before the methods and properties of the extension are available. You write these constraints -after the name of the protocol you’re extending using a where clause -*/ + When you define a protocol extension, you can specify constraints that conforming types must satisfy + before the methods and properties of the extension are available. You write these constraints + after the name of the protocol you’re extending using a where clause + */ -extension CollectionType where Generator.Element: TextRepresentable { +extension Collection where Iterator.Element: TextRepresentable { var textualDescription: String { let itemsAsText = self.map { $0.textualDescription } - return "[" + itemsAsText.joinWithSeparator(", ") + "]" + return "[" + itemsAsText.joined(separator: ", ") + "]" } } @@ -569,8 +569,8 @@ print(hamsters.textualDescription) // prints "[A hamster named Murray, A hamster named Morgan, A hamster named Maurice]" /* -NOTE - -If a conforming type satisfies the requirements for multiple constrained extensions that provide implementations -for the same method or property, Swift will use the implementation corresponding to the most specialized constraints. -*/ + NOTE + + If a conforming type satisfies the requirements for multiple constrained extensions that provide implementations + for the same method or property, Swift will use the implementation corresponding to the most specialized constraints. + */ diff --git a/21_Protocols.playground/contents.xcplayground b/22_Protocols.playground/contents.xcplayground similarity index 100% rename from 21_Protocols.playground/contents.xcplayground rename to 22_Protocols.playground/contents.xcplayground diff --git a/23_Access Control.playground/Resources/21_Protocols.playground/playground.xcworkspace/contents.xcworkspacedata b/23_Access Control.playground/Resources/21_Protocols.playground/playground.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a..0000000 --- a/23_Access Control.playground/Resources/21_Protocols.playground/playground.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/23_Access Control.playground/Resources/21_Protocols.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate b/23_Access Control.playground/Resources/21_Protocols.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index d310f58b7caaccd735f83c46d182251a307f3db0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17091 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 - - - - diff --git a/23_Access Control.playground/playground.xcworkspace/contents.xcworkspacedata b/23_Access Control.playground/playground.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a..0000000 --- a/23_Access Control.playground/playground.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/23_Access Control.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate b/23_Access Control.playground/playground.xcworkspace/xcuserdata/development.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index d07c76848e000d0cb6d42e8566e8a29ceebde646..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18127 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 ShKUd;?fYIXe@Fh?z5f9V{g{dX diff --git a/23_Generics.playground/Contents.swift b/23_Generics.playground/Contents.swift new file mode 100644 index 0000000..2f3f436 --- /dev/null +++ b/23_Generics.playground/Contents.swift @@ -0,0 +1,248 @@ + +// |=------------------------------------------------------=| +// Copyright (c) 2016 Juan Antonio Karmy. +// Licensed under MIT License +// +// See https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ for Swift Language Reference +// +// See Juan Antonio Karmy - http://karmy.co | http://twitter.com/jkarmy +// +// |=------------------------------------------------------=| + + +import UIKit + +/* + ================= + Generic Functions + ================= + */ + +// Basic example + +func swapTwoValues( _ a: inout T, _ b: inout T) { + let temporaryA = a + a = b + b = temporaryA +} + +var someInt = 3 +var anotherInt = 107 +swapTwoValues(&someInt, &anotherInt) +// someInt is now 107, and anotherInt is now 3 + +var someString = "hello" +var anotherString = "world" +swapTwoValues(&someString, &anotherString) +// someString is now "world", and anotherString is now "hello" + +/* + The swapTwoValues(_:_:) function defined above is inspired by a generic function called swap, + which is part of the Swift standard library, and is automatically made available for you to use in your apps. + If you need the behavior of the swapTwoValues(_:_:) function in your own code, you can use Swift’s + existing swap(_:_:) function rather than providing your own implementation. + */ + +/*You can provide more than one type parameter by writing multiple type parameter names within the angle brackets, separated by commas.*/ + +/* + ====================== + Naming Type Parameters + ====================== + */ + +/* + In most cases, type parameters have descriptive names, such as Key and Value in Dictionary + and Element in Array, which tells the reader about the relationship between the type parameter + and the generic type or function it’s used in. However, when there isn’t a meaningful relationship between them, + it’s traditional to name them using single letters such as T, U, and V, such as T in the swapTwoValues(_:_:) function above. + */ + +/* + NOTE + + Always give type parameters upper camel case names (such as T and MyTypeParameter) to indicate + that they are a placeholder for a type, not a value. + */ + + +/* + ============= + Generic Types + ============= + */ + +/* + Swift enables you to define your own generic types. These are custom classes, structures, + and enumerations that can work with any type, in a similar way to Array and Dictionary. + */ + +struct Stack { + var items = [Element]() + mutating func push(item: Element) { + items.append(item) + } + mutating func pop() -> Element { + return items.removeLast() + } +} + +/* + Note how the generic version of Stack is essentially the same as the non-generic version, + but with a type parameter called Element instead of an actual type of Int. + This type parameter is written within a pair of angle brackets () immediately after the structure’s name. + + Element defines a placeholder name for “some type Element” to be provided later on. + This future type can be referred to as “Element” anywhere within the structure’s definition. + */ + +var stackOfStrings = Stack() +stackOfStrings.push(item: "uno") +stackOfStrings.push(item: "dos") +stackOfStrings.push(item: "tres") +stackOfStrings.push(item: "cuatro") +// the stack now contains 4 strings + + +/* + ======================== + Extending a Generic Type + ======================== + */ + +/* + When you extend a generic type, you do not provide a type parameter list as part of the extension’s definition. + Instead, the type parameter list from the original type definition is available within the body of the extension, + and the original type parameter names are used to refer to the type parameters from the original definition. + */ + +extension Stack { + var topItem: Element? { + return items.isEmpty ? nil : items[items.count - 1] + } +} + +/* + Note that this extension does not define a type parameter list. + Instead, the Stack type’s existing type parameter name, Element, + is used within the extension to indicate the optional type of the topItem computed property. + */ + + +/* + ================ + Type Constraints + ================ + */ + +protocol SomeProtocol { + +} + +class SomeClass { + +} + +func someFunction(someT: T, someU: U) { + // function body goes here +} + +/* + The hypothetical function above has two type parameters. The first type parameter, T, + has a type constraint that requires T to be a subclass of SomeClass. + The second type parameter, U, has a type constraint that requires U to conform to the protocol SomeProtocol. + */ + +// Example +func findIndex(array: [T], _ valueToFind: T) -> Int? { + for (index, value) in array.enumerated() { + if value == valueToFind { + return index + } + } + return nil +} + +/* + ================ + Associated Types + ================ + */ + +/* + The Container protocol needs a way to refer to the type of the elements that a container will hold, + without knowing what that type is for a specific container. + */ + +protocol Container { + associatedtype ItemType + mutating func append(item: ItemType) + var count: Int { get } + subscript(i: Int) -> ItemType { get } +} + +struct OtherStack: Container { + // original Stack implementation + var items = [Element]() + mutating func push(item: Element) { + items.append(item) + } + mutating func pop() -> Element { + return items.removeLast() + } + // conformance to the Container protocol + mutating func append(item: Element) { + self.push(item: item) + } + var count: Int { + return items.count + } + subscript(i: Int) -> Element { + return items[i] + } +} + +/* + Thanks to Swift’s type inference, you don’t actually need to declare a concrete ItemType of Int as part of the definition of IntStack. + Because IntStack conforms to all of the requirements of the Container protocol, Swift can infer the appropriate ItemType to use, + simply by looking at the type of the append(_:) method’s item parameter and the return type of the subscript. + Indeed, if you delete the typealias ItemType = Int line from the code above, + everything still works, because it is clear what type should be used for ItemType. + */ + +// You can extend an existing type to add conformance to a protocol. + +extension Array: Container {} + +/* + ================ + Associated Types + ================ + */ + +func allItemsMatch< + C1: Container, C2: Container + where C1.ItemType == C2.ItemType, C1.ItemType: Equatable> + (someContainer: C1, _ anotherContainer: C2) -> Bool { + + // check that both containers contain the same number of items + if someContainer.count != anotherContainer.count { + return false + } + + // check each pair of items to see if they are equivalent + for i in 0.. - - - - diff --git a/24_Higher Order Functions.playground/playground.xcworkspace/xcuserdata/nhat.tien.xcuserdatad/UserInterfaceState.xcuserstate b/24_Higher Order Functions.playground/playground.xcworkspace/xcuserdata/nhat.tien.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index 171d08afe98b1d1851a8f5f009d643c5149947da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8287 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

U+ zIa$ep7CzbK@i78P$}MDMJBT;B!5Wipr|j~ggYKX^@f|$cL7$?3!ejV15dr>dZ_+L0 z|3cWKiIGZB`W$^h^z%)4xSj6CnU%i$MJOcA>XB^A>p?#Pw4yfjCgrM|BmnD8Ftis`~VZXZYp9P?RirXx}ab_ zTvmRU&?-2kN>T8hpy%ml;{%?HguO1ZLSOchC>sXDF!DWnDWYL7Kw@bkd;O8ZUVUV< zS04->X$@_qi|KmyVq+tHgl=LlHrm;%ja~G4x|_Y$*vAZVfF7i;u@@RwBjO`QMBE?I z8F3)ubi}!c^AQ&!E=F9AxFM6vG%|y%m+V&A5ZO@KFj=0gKvpCxmX*lvl9kG)$!cUy zS)FXUY=*2s=9V?dyfVKGW$R?^vJYvk+X>*X8d z8|9D4H_0EDKQG@c-y`2A-!DHPKPZ1q{<{1P`C<7H`KR(5k-Eq}ky(+$BF9I%B9}*Q zh};~xC30)z6OqqGz8QHe@`K2WkzYoB75Po%mB{ZDy%qfxNs1Ijx*}7Ntr)B*R+K5m zD8?x&6xE6;3cJFgs8y^|Y*W0VIIMVEaa3_!aaQrA;w#11ipz>`6;~D46xWqXrAnz* zYL%SQpfo9YWsI_)GF>@JIZZiF`LJ@U@}Tml^0e}d@~rYh<;TiTlwT>oR$f+qtGueb zro0|yiW(AC66K6q9<@HIJ!(hPb5Z-FUX3~x^^d53tD;qjs{X10s$^BFDqU5pYEXGp zvs6A6s+OtNsMe|0t2U@MtG241RvlBFR9#X15Uq?hMc))18{IcLKDsX26MbLw(&)D6 z?a}W=zps|5_3FXuV)bZswR(!$u6C$rsGHQy>ILeB>P71N)Q_q+sduQKQ@@~oQN36F zlKOS^8|uUABkFh5$JBpQpHpAb$TWJ5P19R*lO|TvS2IA9tVz|RYce(2nsQB(W}W6q z%?p~{nmw9Bn!}nSnxmTIniHDOG@om}(_GVB*WA$jqy?=>+eh118?Q~!-m1;k4%XhT zy+d1|Ez%ZiOSBWTGqgVKJnaM8mD<(Xwb~8ZjoL@Fo3z`s&uI5*4{MKW&uTx?p3|P! zUeI3D-q6W)DxF%V)p5E$y1u%2U4m|aE?JkVOVyPM<>W}MB=+Eds(x20Rs{c%XMSo3yUH^jt4AdYqL>d$Z&d|ru z*AQ<=Fbpsx8&VDFhQWqnLz!WWVVt4DP;HoEup1nPTEim42E#tXn}#!nvxW~19~(X~ zoHtxBTr_-PxMcX*NQ@Cixlv(^GDaIUMx9Y_G#XQkLycpNg3)hWZfrB|H=ZzFG+s7d zF@9(K(WElzO%_wE=@wI*Dan*q_VJ(!Mk}M-^{o0^Y{fk^7ruT`N#O3 z{4@M6{&{{c{}TT){|bMUKgEB_U*x~wFY%Z8Z~3eIHH*qpXc=pnWSMN4YMExKvCOnI zT0E9n7N4crvf9#NdBt+d@{#4d<$~p+by}BM zH(Fn{9yI{-&1|#SthQdZKDL`}x7m_xDYi6QhAqpMV;g3> a%T{5lv(2>43RG!8Y1j7!={xvo^ZgH^5m=@G diff --git a/24_Higher Order Functions.playground/Contents.swift b/25_Higher Order Functions.playground/Contents.swift similarity index 55% rename from 24_Higher Order Functions.playground/Contents.swift rename to 25_Higher Order Functions.playground/Contents.swift index 1cc17fc..61c1737 100644 --- a/24_Higher Order Functions.playground/Contents.swift +++ b/25_Higher Order Functions.playground/Contents.swift @@ -1,22 +1,36 @@ -// Created by Tien Vu - https://github.com/Tj3n -//: HIGH ORDER FUNCTIONS -// Playground - noun: a place where people can play +// |=------------------------------------------------------=| +// Copyright (c) 2016 Juan Antonio Karmy. +// Licensed under MIT License +// +// See https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ for Swift Language Reference +// +// See Juan Antonio Karmy - http://karmy.co | http://twitter.com/jkarmy +// +// |=------------------------------------------------------=| + +// Page created by Tien Vu - https://github.com/Tj3n + +/* + ==================== + HIGH ORDER FUNCTIONS + ==================== + */ import UIKit var array = [1,2,3,4,5] -//: Map: each value in array become another value (can become different type also) +//: Map: Manipulate each value in the array. They can have a different value or type. let mapped = array.map { (value) -> Int in - return value+1 + return value + 1 } let mappedShort = array.map({ "\($0) in String"}) mappedShort -//: Filter: each value in array must pass a rule to append itself into newly made array +//: Filter: each value in array must pass a rule to append itself into a newly made array let filtered = array.filter { (value) -> Bool in return value >= 4 } @@ -35,15 +49,15 @@ let reduced = array.reduce(0) { (value1, value2) -> Int in let reducedShort = array.reduce(0, combine: ({ $0 + $1 })) reducedShort -// "test" is starting value +// "test" is the starting value let reducedShort2 = array.reduce("test", combine: ({ "\($0)\($1)"})) reducedShort2 -// Can be mathematics function +// Mathematics functions can be used let reducedShorter = array.reduce(1, combine: *) -//: Flatmap: support optional and squence of sequence +//: Flatmap: supports optionals and squence of sequence var multidimentionalArray: [[Int]?] = [[1,2], [3,5], [4], nil] let flatmapped: [[Int]?] = multidimentionalArray.flatMap { (array) in diff --git a/24_Higher Order Functions.playground/contents.xcplayground b/25_Higher Order Functions.playground/contents.xcplayground similarity index 100% rename from 24_Higher Order Functions.playground/contents.xcplayground rename to 25_Higher Order Functions.playground/contents.xcplayground