From 1da9880635f49d0bd1c3d1ad45bd1436cfe76d0a Mon Sep 17 00:00:00 2001 From: Alexander Kravchenko Date: Fri, 26 May 2017 11:24:20 +0300 Subject: [PATCH 1/4] Swift3 samples --- Swift/1-simple-closure.swift | 15 +++++++++++++++ Swift/2-closure-in-func.swift | 24 ++++++++++++++++++++++++ Swift/3-escaping.swift | 19 +++++++++++++++++++ Swift/4-autoclosure.swift | 14 ++++++++++++++ 4 files changed, 72 insertions(+) create mode 100644 Swift/1-simple-closure.swift create mode 100644 Swift/2-closure-in-func.swift create mode 100644 Swift/3-escaping.swift create mode 100644 Swift/4-autoclosure.swift diff --git a/Swift/1-simple-closure.swift b/Swift/1-simple-closure.swift new file mode 100644 index 0000000..b636acf --- /dev/null +++ b/Swift/1-simple-closure.swift @@ -0,0 +1,15 @@ +var hiThere: () -> (String) = { + return "Hi there!" +} +hiThere() // Hi there! + + +var square: (Int) -> (Int) = { x in + return x * x +} + +square(10) // 100 + +var newSquare = square + +newSquare(5) // 25 diff --git a/Swift/2-closure-in-func.swift b/Swift/2-closure-in-func.swift new file mode 100644 index 0000000..568575e --- /dev/null +++ b/Swift/2-closure-in-func.swift @@ -0,0 +1,24 @@ +func repeatFunc(num: Int, f: () -> ()) { + for _ in 1...num { + f() + } +} + +repeatFunc(num: 5) { + print("Hello world") +} // prints "Hello world" 5 times + + +let myArray = [0,1,2,3,4] +func through(array arr: [Int], f: (Int) -> (Int)) -> [Int] { + var result: [Int] = [] + for i in arr { + result.append(f(i)) + } + return result +} + + +through(array: myArray) { + $0 + $0 +} // [0,2,4,6,8] diff --git a/Swift/3-escaping.swift b/Swift/3-escaping.swift new file mode 100644 index 0000000..899337f --- /dev/null +++ b/Swift/3-escaping.swift @@ -0,0 +1,19 @@ +import Foundation + +func simplePrint(f: (String) -> (String)) { + print(f("Hello world")) +} + +func escapingClosure(closure: @escaping (String) -> (String)) { + DispatchQueue.global().async { + simplePrint(f: closure) // This code executes asynchronously + } // Removing @escaping provides compilation error +} + +escapingClosure { str in + return str.uppercased() +} + +// Default closure type is @noescape + + diff --git a/Swift/4-autoclosure.swift b/Swift/4-autoclosure.swift new file mode 100644 index 0000000..0a0fbd7 --- /dev/null +++ b/Swift/4-autoclosure.swift @@ -0,0 +1,14 @@ +struct Test { + init() { + print("Test initialized") + } +} + +func testFunc(isEnabled: Bool, closure: @autoclosure () -> Test) { + if isEnabled { + closure() + } +} + +testFunc(isEnabled: true, closure: Test()) +testFunc(isEnabled: false, closure: Test()) From c08d8b0b10e873af781e9148ae9a67e65a4a501e Mon Sep 17 00:00:00 2001 From: Alexander Kravchenko Date: Tue, 30 May 2017 15:08:16 +0300 Subject: [PATCH 2/4] Playground mode --- .../Contents.swift | 7 +++++ .../Escaping.xcplaygroundpage/Contents.swift | 7 +++++ .../Contents.swift | 7 +++++ .../Simple.xcplaygroundpage/Contents.swift | 7 +++-- Swift/3-escaping.swift | 19 ------------ .../Contents.swift} | 6 ++++ .../Escaping.xcplaygroundpage/Contents.swift | 29 ++++++++++++++++++ .../Contents.swift} | 11 +++++-- .../Simple.xcplaygroundpage/Contents.swift | 23 ++++++++++++++ .../Closures.playground/contents.xcplayground | 9 ++++++ .../contents.xcworkspacedata | 7 +++++ .../UserInterfaceState.xcuserstate | Bin 0 -> 11639 bytes 12 files changed, 109 insertions(+), 23 deletions(-) create mode 100644 Closures.playground/Pages/Autoclosure.xcplaygroundpage/Contents.swift create mode 100644 Closures.playground/Pages/Escaping.xcplaygroundpage/Contents.swift create mode 100644 Closures.playground/Pages/In function.xcplaygroundpage/Contents.swift rename Swift/1-simple-closure.swift => Closures.playground/Pages/Simple.xcplaygroundpage/Contents.swift (70%) delete mode 100644 Swift/3-escaping.swift rename Swift/{4-autoclosure.swift => Closures.playground/Pages/Autoclosure.xcplaygroundpage/Contents.swift} (67%) create mode 100644 Swift/Closures.playground/Pages/Escaping.xcplaygroundpage/Contents.swift rename Swift/{2-closure-in-func.swift => Closures.playground/Pages/In function.xcplaygroundpage/Contents.swift} (83%) create mode 100644 Swift/Closures.playground/Pages/Simple.xcplaygroundpage/Contents.swift create mode 100644 Swift/Closures.playground/contents.xcplayground create mode 100644 Swift/Closures.playground/playground.xcworkspace/contents.xcworkspacedata create mode 100644 Swift/Closures.playground/playground.xcworkspace/xcuserdata/Askrav.xcuserdatad/UserInterfaceState.xcuserstate diff --git a/Closures.playground/Pages/Autoclosure.xcplaygroundpage/Contents.swift b/Closures.playground/Pages/Autoclosure.xcplaygroundpage/Contents.swift new file mode 100644 index 0000000..854a033 --- /dev/null +++ b/Closures.playground/Pages/Autoclosure.xcplaygroundpage/Contents.swift @@ -0,0 +1,7 @@ +//: [Previous](@previous) + +import Foundation + +var str = "Hello, playground" + +//: [Next](@next) diff --git a/Closures.playground/Pages/Escaping.xcplaygroundpage/Contents.swift b/Closures.playground/Pages/Escaping.xcplaygroundpage/Contents.swift new file mode 100644 index 0000000..854a033 --- /dev/null +++ b/Closures.playground/Pages/Escaping.xcplaygroundpage/Contents.swift @@ -0,0 +1,7 @@ +//: [Previous](@previous) + +import Foundation + +var str = "Hello, playground" + +//: [Next](@next) diff --git a/Closures.playground/Pages/In function.xcplaygroundpage/Contents.swift b/Closures.playground/Pages/In function.xcplaygroundpage/Contents.swift new file mode 100644 index 0000000..854a033 --- /dev/null +++ b/Closures.playground/Pages/In function.xcplaygroundpage/Contents.swift @@ -0,0 +1,7 @@ +//: [Previous](@previous) + +import Foundation + +var str = "Hello, playground" + +//: [Next](@next) diff --git a/Swift/1-simple-closure.swift b/Closures.playground/Pages/Simple.xcplaygroundpage/Contents.swift similarity index 70% rename from Swift/1-simple-closure.swift rename to Closures.playground/Pages/Simple.xcplaygroundpage/Contents.swift index b636acf..6913ebf 100644 --- a/Swift/1-simple-closure.swift +++ b/Closures.playground/Pages/Simple.xcplaygroundpage/Contents.swift @@ -1,3 +1,6 @@ +//: [Closure as function parameter](@next) + + var hiThere: () -> (String) = { return "Hi there!" } @@ -8,8 +11,8 @@ var square: (Int) -> (Int) = { x in return x * x } -square(10) // 100 +square(10) var newSquare = square -newSquare(5) // 25 +newSquare(5) diff --git a/Swift/3-escaping.swift b/Swift/3-escaping.swift deleted file mode 100644 index 899337f..0000000 --- a/Swift/3-escaping.swift +++ /dev/null @@ -1,19 +0,0 @@ -import Foundation - -func simplePrint(f: (String) -> (String)) { - print(f("Hello world")) -} - -func escapingClosure(closure: @escaping (String) -> (String)) { - DispatchQueue.global().async { - simplePrint(f: closure) // This code executes asynchronously - } // Removing @escaping provides compilation error -} - -escapingClosure { str in - return str.uppercased() -} - -// Default closure type is @noescape - - diff --git a/Swift/4-autoclosure.swift b/Swift/Closures.playground/Pages/Autoclosure.xcplaygroundpage/Contents.swift similarity index 67% rename from Swift/4-autoclosure.swift rename to Swift/Closures.playground/Pages/Autoclosure.xcplaygroundpage/Contents.swift index 0a0fbd7..d9f0b53 100644 --- a/Swift/4-autoclosure.swift +++ b/Swift/Closures.playground/Pages/Autoclosure.xcplaygroundpage/Contents.swift @@ -1,3 +1,5 @@ +//: [Escaping closure](@previous) + struct Test { init() { print("Test initialized") @@ -12,3 +14,7 @@ func testFunc(isEnabled: Bool, closure: @autoclosure () -> Test) { testFunc(isEnabled: true, closure: Test()) testFunc(isEnabled: false, closure: Test()) + +/*: ### + Important: autoclosure doesn't take arguments because there's no way to pass them + */ \ No newline at end of file diff --git a/Swift/Closures.playground/Pages/Escaping.xcplaygroundpage/Contents.swift b/Swift/Closures.playground/Pages/Escaping.xcplaygroundpage/Contents.swift new file mode 100644 index 0000000..ca5287f --- /dev/null +++ b/Swift/Closures.playground/Pages/Escaping.xcplaygroundpage/Contents.swift @@ -0,0 +1,29 @@ +//: [Closure as function parameter](@previous) + +import Foundation + +func simplePrint(f: (String) -> (String)) { + print(f("Hello world")) +} + +/*: ### + Code inside DispatchQueue.global() executes asynchronously, + removing @escaping provides compilation error + */ +func escapingClosure(closure: @escaping (String) -> (String)) { + DispatchQueue.global().async { + simplePrint(f: closure) + } +} + +/*: ### +We run escapingClosure() func, which will asynchronously execute simplePrint() and pass closure as parameter + */ + +escapingClosure { str in + str.uppercased() +} + +/*: ### Default closure type is @noescape */ + +//: [Autoclosure](@next) diff --git a/Swift/2-closure-in-func.swift b/Swift/Closures.playground/Pages/In function.xcplaygroundpage/Contents.swift similarity index 83% rename from Swift/2-closure-in-func.swift rename to Swift/Closures.playground/Pages/In function.xcplaygroundpage/Contents.swift index 568575e..e202c16 100644 --- a/Swift/2-closure-in-func.swift +++ b/Swift/Closures.playground/Pages/In function.xcplaygroundpage/Contents.swift @@ -1,3 +1,5 @@ +//: [Simple closure](@previous) + func repeatFunc(num: Int, f: () -> ()) { for _ in 1...num { f() @@ -6,7 +8,8 @@ func repeatFunc(num: Int, f: () -> ()) { repeatFunc(num: 5) { print("Hello world") -} // prints "Hello world" 5 times +} + let myArray = [0,1,2,3,4] @@ -21,4 +24,8 @@ func through(array arr: [Int], f: (Int) -> (Int)) -> [Int] { through(array: myArray) { $0 + $0 -} // [0,2,4,6,8] +} + +//: [Escaping closure](@next) + + diff --git a/Swift/Closures.playground/Pages/Simple.xcplaygroundpage/Contents.swift b/Swift/Closures.playground/Pages/Simple.xcplaygroundpage/Contents.swift new file mode 100644 index 0000000..4a96940 --- /dev/null +++ b/Swift/Closures.playground/Pages/Simple.xcplaygroundpage/Contents.swift @@ -0,0 +1,23 @@ +var hiThere: () -> (String) = { + return "Hi there!" +} +hiThere() + + +var square: (Int) -> (Int) = { x in + return x * x +} + +/*: ### + Without explicitly declaring "x", you can use $0 as parameter: + */ +var squareAgain: (Int) -> (Int) = { + $0 * $0 +} +square(10) + +var newSquare = square + +newSquare(5) + +//: [Closure as function parameter](@next) diff --git a/Swift/Closures.playground/contents.xcplayground b/Swift/Closures.playground/contents.xcplayground new file mode 100644 index 0000000..1a05bbd --- /dev/null +++ b/Swift/Closures.playground/contents.xcplayground @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/Swift/Closures.playground/playground.xcworkspace/contents.xcworkspacedata b/Swift/Closures.playground/playground.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/Swift/Closures.playground/playground.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Swift/Closures.playground/playground.xcworkspace/xcuserdata/Askrav.xcuserdatad/UserInterfaceState.xcuserstate b/Swift/Closures.playground/playground.xcworkspace/xcuserdata/Askrav.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..4fdc24a2601ae862e4967b62418fd416a2388c29 GIT binary patch literal 11639 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 C1?LR_ literal 0 HcmV?d00001 From 61bdf20797ead1cc6d81d03b37d3d3c9aab1dce4 Mon Sep 17 00:00:00 2001 From: Alexander Kravchenko Date: Tue, 30 May 2017 15:11:38 +0300 Subject: [PATCH 3/4] hotfix --- .../Contents.swift | 7 ------- .../Escaping.xcplaygroundpage/Contents.swift | 7 ------- .../Contents.swift | 7 ------- .../Simple.xcplaygroundpage/Contents.swift | 18 ------------------ .../UserInterfaceState.xcuserstate | Bin 11639 -> 13951 bytes 5 files changed, 39 deletions(-) delete mode 100644 Closures.playground/Pages/Autoclosure.xcplaygroundpage/Contents.swift delete mode 100644 Closures.playground/Pages/Escaping.xcplaygroundpage/Contents.swift delete mode 100644 Closures.playground/Pages/In function.xcplaygroundpage/Contents.swift delete mode 100644 Closures.playground/Pages/Simple.xcplaygroundpage/Contents.swift diff --git a/Closures.playground/Pages/Autoclosure.xcplaygroundpage/Contents.swift b/Closures.playground/Pages/Autoclosure.xcplaygroundpage/Contents.swift deleted file mode 100644 index 854a033..0000000 --- a/Closures.playground/Pages/Autoclosure.xcplaygroundpage/Contents.swift +++ /dev/null @@ -1,7 +0,0 @@ -//: [Previous](@previous) - -import Foundation - -var str = "Hello, playground" - -//: [Next](@next) diff --git a/Closures.playground/Pages/Escaping.xcplaygroundpage/Contents.swift b/Closures.playground/Pages/Escaping.xcplaygroundpage/Contents.swift deleted file mode 100644 index 854a033..0000000 --- a/Closures.playground/Pages/Escaping.xcplaygroundpage/Contents.swift +++ /dev/null @@ -1,7 +0,0 @@ -//: [Previous](@previous) - -import Foundation - -var str = "Hello, playground" - -//: [Next](@next) diff --git a/Closures.playground/Pages/In function.xcplaygroundpage/Contents.swift b/Closures.playground/Pages/In function.xcplaygroundpage/Contents.swift deleted file mode 100644 index 854a033..0000000 --- a/Closures.playground/Pages/In function.xcplaygroundpage/Contents.swift +++ /dev/null @@ -1,7 +0,0 @@ -//: [Previous](@previous) - -import Foundation - -var str = "Hello, playground" - -//: [Next](@next) diff --git a/Closures.playground/Pages/Simple.xcplaygroundpage/Contents.swift b/Closures.playground/Pages/Simple.xcplaygroundpage/Contents.swift deleted file mode 100644 index 6913ebf..0000000 --- a/Closures.playground/Pages/Simple.xcplaygroundpage/Contents.swift +++ /dev/null @@ -1,18 +0,0 @@ -//: [Closure as function parameter](@next) - - -var hiThere: () -> (String) = { - return "Hi there!" -} -hiThere() // Hi there! - - -var square: (Int) -> (Int) = { x in - return x * x -} - -square(10) - -var newSquare = square - -newSquare(5) diff --git a/Swift/Closures.playground/playground.xcworkspace/xcuserdata/Askrav.xcuserdatad/UserInterfaceState.xcuserstate b/Swift/Closures.playground/playground.xcworkspace/xcuserdata/Askrav.xcuserdatad/UserInterfaceState.xcuserstate index 4fdc24a2601ae862e4967b62418fd416a2388c29..34d0f2297f3795e5e0376bbdcf175f143f1959b8 100644 GIT binary patch literal 13951 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 H@!tOdCRjKT From ab848882d7bc951de195028737b19c826981afdd Mon Sep 17 00:00:00 2001 From: Alexander Kravchenko Date: Thu, 1 Jun 2017 10:22:45 +0300 Subject: [PATCH 4/4] Minor changes --- .../Escaping.xcplaygroundpage/Contents.swift | 29 ------------- .../UserInterfaceState.xcuserstate | Bin 13951 -> 0 bytes .../Contents.swift | 4 -- .../Escaping.xcplaygroundpage/Contents.swift | 41 ++++++++++++++++++ .../Contents.swift | 12 +++-- .../Simple.xcplaygroundpage/Contents.swift | 0 .../contents.xcplayground | 2 +- .../contents.xcworkspacedata | 0 .../UserInterfaceState.xcuserstate | Bin 0 -> 10724 bytes 9 files changed, 50 insertions(+), 38 deletions(-) delete mode 100644 Swift/Closures.playground/Pages/Escaping.xcplaygroundpage/Contents.swift delete mode 100644 Swift/Closures.playground/playground.xcworkspace/xcuserdata/Askrav.xcuserdatad/UserInterfaceState.xcuserstate rename Swift/{Closures.playground => SwiftClosures.playground}/Pages/Autoclosure.xcplaygroundpage/Contents.swift (76%) create mode 100644 Swift/SwiftClosures.playground/Pages/Escaping.xcplaygroundpage/Contents.swift rename Swift/{Closures.playground => SwiftClosures.playground}/Pages/In function.xcplaygroundpage/Contents.swift (77%) rename Swift/{Closures.playground => SwiftClosures.playground}/Pages/Simple.xcplaygroundpage/Contents.swift (100%) rename Swift/{Closures.playground => SwiftClosures.playground}/contents.xcplayground (75%) rename Swift/{Closures.playground => SwiftClosures.playground}/playground.xcworkspace/contents.xcworkspacedata (100%) create mode 100644 Swift/SwiftClosures.playground/playground.xcworkspace/xcuserdata/Askrav.xcuserdatad/UserInterfaceState.xcuserstate diff --git a/Swift/Closures.playground/Pages/Escaping.xcplaygroundpage/Contents.swift b/Swift/Closures.playground/Pages/Escaping.xcplaygroundpage/Contents.swift deleted file mode 100644 index ca5287f..0000000 --- a/Swift/Closures.playground/Pages/Escaping.xcplaygroundpage/Contents.swift +++ /dev/null @@ -1,29 +0,0 @@ -//: [Closure as function parameter](@previous) - -import Foundation - -func simplePrint(f: (String) -> (String)) { - print(f("Hello world")) -} - -/*: ### - Code inside DispatchQueue.global() executes asynchronously, - removing @escaping provides compilation error - */ -func escapingClosure(closure: @escaping (String) -> (String)) { - DispatchQueue.global().async { - simplePrint(f: closure) - } -} - -/*: ### -We run escapingClosure() func, which will asynchronously execute simplePrint() and pass closure as parameter - */ - -escapingClosure { str in - str.uppercased() -} - -/*: ### Default closure type is @noescape */ - -//: [Autoclosure](@next) diff --git a/Swift/Closures.playground/playground.xcworkspace/xcuserdata/Askrav.xcuserdatad/UserInterfaceState.xcuserstate b/Swift/Closures.playground/playground.xcworkspace/xcuserdata/Askrav.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index 34d0f2297f3795e5e0376bbdcf175f143f1959b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13951 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 xww<<}OBN)HlcmYBWF|Q>IVw3WxkqwJa$fSF Test) { testFunc(isEnabled: true, closure: Test()) testFunc(isEnabled: false, closure: Test()) - -/*: ### - Important: autoclosure doesn't take arguments because there's no way to pass them - */ \ No newline at end of file diff --git a/Swift/SwiftClosures.playground/Pages/Escaping.xcplaygroundpage/Contents.swift b/Swift/SwiftClosures.playground/Pages/Escaping.xcplaygroundpage/Contents.swift new file mode 100644 index 0000000..51784c5 --- /dev/null +++ b/Swift/SwiftClosures.playground/Pages/Escaping.xcplaygroundpage/Contents.swift @@ -0,0 +1,41 @@ +//: [Closure as function parameter](@previous) + +import Foundation + +struct FunctionStorage { + + typealias ClosureType = (Int, Int) -> Int + + private(set) var funcList: [ClosureType] = [] + + mutating func append(aFunction: @escaping ClosureType) { + funcList.append(aFunction) + } + +/*: ### The functions append() accepts and adds to the array a closure declared outside the function. */ + + mutating func append(functions: @escaping ClosureType...) { + funcList.append(contentsOf: functions) + } + + func apply(to value: Int, + and aValue: Int, + from initial: Int = 0, with action: ClosureType) -> Int { + + return funcList.reduce(initial) { (res, fn) -> Int in + action(res, fn(value, aValue)) + } + } +} + +var storage = FunctionStorage() +storage.append(functions: (*), (+), (-)) +storage.apply(to: 4, and: 2, with: (+)) + + +/*: ### Default closure type is @noescape */ + +//: [Autoclosure](@next) + + + diff --git a/Swift/Closures.playground/Pages/In function.xcplaygroundpage/Contents.swift b/Swift/SwiftClosures.playground/Pages/In function.xcplaygroundpage/Contents.swift similarity index 77% rename from Swift/Closures.playground/Pages/In function.xcplaygroundpage/Contents.swift rename to Swift/SwiftClosures.playground/Pages/In function.xcplaygroundpage/Contents.swift index e202c16..92d8a8f 100644 --- a/Swift/Closures.playground/Pages/In function.xcplaygroundpage/Contents.swift +++ b/Swift/SwiftClosures.playground/Pages/In function.xcplaygroundpage/Contents.swift @@ -5,13 +5,16 @@ func repeatFunc(num: Int, f: () -> ()) { f() } } - repeatFunc(num: 5) { print("Hello world") -} +} +var square: (Int) -> (Int) = { x in + return x * x +} + let myArray = [0,1,2,3,4] func through(array arr: [Int], f: (Int) -> (Int)) -> [Int] { var result: [Int] = [] @@ -22,10 +25,11 @@ func through(array arr: [Int], f: (Int) -> (Int)) -> [Int] { } -through(array: myArray) { - $0 + $0 +let result = through(array: myArray) { + square($0) } + //: [Escaping closure](@next) diff --git a/Swift/Closures.playground/Pages/Simple.xcplaygroundpage/Contents.swift b/Swift/SwiftClosures.playground/Pages/Simple.xcplaygroundpage/Contents.swift similarity index 100% rename from Swift/Closures.playground/Pages/Simple.xcplaygroundpage/Contents.swift rename to Swift/SwiftClosures.playground/Pages/Simple.xcplaygroundpage/Contents.swift diff --git a/Swift/Closures.playground/contents.xcplayground b/Swift/SwiftClosures.playground/contents.xcplayground similarity index 75% rename from Swift/Closures.playground/contents.xcplayground rename to Swift/SwiftClosures.playground/contents.xcplayground index 1a05bbd..a220fd5 100644 --- a/Swift/Closures.playground/contents.xcplayground +++ b/Swift/SwiftClosures.playground/contents.xcplayground @@ -1,5 +1,5 @@ - + diff --git a/Swift/Closures.playground/playground.xcworkspace/contents.xcworkspacedata b/Swift/SwiftClosures.playground/playground.xcworkspace/contents.xcworkspacedata similarity index 100% rename from Swift/Closures.playground/playground.xcworkspace/contents.xcworkspacedata rename to Swift/SwiftClosures.playground/playground.xcworkspace/contents.xcworkspacedata diff --git a/Swift/SwiftClosures.playground/playground.xcworkspace/xcuserdata/Askrav.xcuserdatad/UserInterfaceState.xcuserstate b/Swift/SwiftClosures.playground/playground.xcworkspace/xcuserdata/Askrav.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..411db5daea4f1304abb6ad7bf578bbeed4d7f08e GIT binary patch literal 10724 zcmc&)33wCLx4-vJN!lcBwkDH(lClcjS6T$RQCUhU-6&;=X*!h9G^t5SsRg_svWTpL zB5t%rP*L1>MG+BDP*K4J#9cxExPglMyED^C8y27MeV^aI`I=1To_p@O=bZaHOQycX z>j{QZQ{M&j4)E8{VcntN)B&!5d$xz%t{M>Xw`c%d zy5#}Y??4KoffmFA9dLjI&>su{13?nV0GS{Ui~^%U5hw;@!8kAxlz|FR17-pzxDo`w zT+jwOzH1YQBh!f|jSoCMvl z0kUuwY=pC+2hM>_&ojYgr-XbP%DQ&An7hNhz#XeM%^E0GH|qS?rY{HPsWjXKbLgwc9* zBievAqMOjoXcM{xZAN#ad(gdT2YL)Wj-Elg(Tivg+J|062hkz)8hRVOi;klY(8uT# z^ac6>ok3^OkLV`~Q4|$L^`j(I45g%0l$xR`3pIcmNF`CpR5~@B8cB_zN~kNSNmMyC znVL$uDG%kN0#uM{qvlcV)BwOEv02z=21yBObl(Nd?Cbm6TM?QO; zre=WK>k0221<_fjqu2z`B}R{2pH@Sl|wM=91BdH+e-20*QBl!C(lu3=9RsunfmyC01iC z*1ZLiiK0?KDo6wAoT}Trhsd1 ziYQ?)WvsugJm7B(xSE?izD8bwDMem?urTfyWOudBT=;BWOcq?EfF z*`)awB*RsW_TJo=Hx#wh8`$C?Omu(>S=eA8gGXB>7 zSM!qD{wtED|E*-#@RHg8E0SgYtz=7h$r7BZwtw52mp~QKN0)(Bz&z_5z>JPvRZHjwzmo&}~?!#;%n#$Wcl3FG3O0HI6Z6q1p#AYnuVagYq9_ug8- z4_+qR=$)3DCC=mMQ%A^p6uS@XC+SaEv6Z}l-C!R$z=wI^JExa(%E5K%wY&&~*OZQo zOwKx@qFw`UUsBaah?3qRDtZs+5*6hU1&zSTJWE@i_i~^+K$Y$tiC)y1fO4$ z=NDn~jXckM?@aTXM5(?3KmM)xej;4XfnWG@GMezo#|6Sk5smg2XR0>@Q~cjdm6lHS zk`q?CXvg!7l^9`4j!IZeq!$dBk(!oh&rBCBC=Q;_?BbTs%oOK|mgjY^KKsXR!JLGk zM`4hHGEQM4q&(6GRMPQ~ZBP!@z*w*jDxnG&5rq{Kb&bI#J?5kqRxaaNW~F8j_u~B? z>Nyp@_Ww~K=j~~t?3dc}KT}|44pCrw?*GQ@q6*|T({toR1=edgpA71Bxa zeQhVS;IUlz=hGL+z=47fa|peHS0{(i0|`dML2xkfyfp-)$KmlrkwZC*<{{|$Z~iJ~iRGKXws*YR=eeqt9oIk#F3&6v8*r)^Le3XUY8O7PDNky3jg-MxXGINp&b5aYFiZipbva(Au3Udpyohn^NM=pmh ziS~}POwM|_si_Nymy+rgj)$e4M46SiMu;|(VObZKoQkS1hf{(5Za5iMz)DyJt6>eC z0&8(Co{H=6G&~*8z%#M)ZdgauJ{``0Goh21!iBFSig)39+>CD`#<+tsfxaLZBpnx* zSce8nUG4tXkW-~18?2n|Z!2@n^)$Ljg*uJgAR8@p)w5owD(RB@uMT;3y zHz!o%VcP_DVOHGOdG?A>VKE!@H2N;WffGpJ?_q;8hzLTK%~7hP#9)`KBt^~nU<)}I z(2w1n@G9KEX+T|EQxz6;T!?KZA(AsfD@g2ub7321aZ@<|hgZV|K+^>~;Cws_H+I2= z@ESZDd+?kYgiT-fQjzc6)+f3eeV$Nj16$rd|5`hrQV2%vgiE`)R6!JNIb3-j=T(HW z7tiUR?-%BYl4rDK4R8~_3b)|J+@`D%-L1$M$N*bTSByWlps9o`M^!2uk^A>4}R;x;@F zx8tjE2cEwJ?tu3Z7u-qyA0*d12+*v9JMaR04RJ(F{uhz!1>`f4yc79p&bISfT)qaj zVIoOgyh42+ha z&i&VTWhXq1Z@|ej_|BBrlM*?856_b79{vE&;8l2a7d%5QR+CrqluCbVfYc-9BIR%J zkMP=m;ii(tYLpXLL4T>iN zNQ*ai@?s^|if|{cZA4ty=g|#W@Xa`xM>52K#BO9q4wQg5;m!EAFq)x(Xh;O+RHLCJ zdfdWcPD?(IRU+$Tloml*i!!hi-^x+0Z;7DHL3w>C(Fnrxc8;eI1j6vmfwss!A58%E zdr<)@L`A3=jX@>o3N#jtL*wzCcnj{tUAP->#dqOtcssuPUa$^LL}h?M<>Xa?Dp3`x zCVqPleuD(K{p58Re~!Pv-*84yafh;)t#55?WCKFr(Q}T?cU?JXaT2%lHMjxCJ+%5+StM>%&OD!O(+k=`o26OOz zoyd#t$H`R_T^^q}+JZtr(~Yh|0TjeL@dNn5Zq!N?-G(0`s(p=avDZ9_Ve+BDrWjiEcov&?-<12IHskGx&LYh`bD>N0vOD;0jyp3b{DE zo+ik|OUtzy_#cwEun}nxVh;hu$OwmkWqdAb6mjn&V`gz|%sgUW?)R$RoM4(bM%va+ zmD%lYPIk3$ZQ6!VpPo3^_ZByOE9wNAi+5B|7g&R~l7p}fKT9(8=ZO37B8QPHjBR<} zkGZglJ%a8-_X9cFi5@@?qKDAK=n?cNIUb@=rG7W>gfn{uE_ZR=7DCZXyrcIv7uQH! zo;PWhIJb8Uzk+w;gZKq}z^O_J=Mxc%64)h&lkRYOA(;LNSlWf2L{H%t@yo>g=vnj} zk$M+;9=%Z4yG}JP0p5dO!h6Fos6u?yL@%MeLX_{dtI#*#CzZQAfiA>{Q!egYl15y5 zKXLsR@IK=Ddn1E}3TUqpqb+)!2>Av`ClaJiYv}puh}d~5mk0#8juw{VS1}L-Jc5pr z?h#24MFon=??UfzVg6!6!p!&3`%cvmB6fsId-o9Ozg_4U$L=4~hczjf;skdJKg6%& z8opfND@?9jNgK|k9vSJq!R%A?nGp0u&;1gSc)JyyM5oYK=xh8Yeha^ik8DM!(KqN@ z^c_BmkK+^gL!4Y&%Fg0TgsByt#@YN;oq%FIHVa9dSVn}gR9xm~^gFlAIrIzq75#?a z!SCYt@cZ1cC`W&hU)vIi)sB&vKoHVg;|h4VBTi~ewvEr!DqL+su0VcXiyZ9%sY zO9AZ>gZy-VAVi83cfiv^DkB1N`Un!9JBKs89w{j--4aGJN=7LN_)>EGK_@CF@)6n8 zq)rX`y*+6Ww{aEh*&?N(xTw#^bV`Rm>WS%;fmA1ykuu?r@u%TCCcR_%A-c$llbdi ziAGTceb=E1sUmy|e}(5vB~C1$aQ}SIl@TkBr6xqoDWxXj|KQVNekX=VE;RSgpZ)?r z_id_zs-&uboT>(?)D)`LsnP`e{*d5HT=XpCV!euPWPP62ps+I69$@E%gb_oF(2Krc z2%jSz_HXfTN2xk$8d+dEHG`T-7OAFOg%ySfPtr#c}^9qqv!VkA$M3?n~G=Yi2E59O0gw3<94(TKd{35gbxD7BHNBs$3R z5l^9)(d+0idJ7#v@1T#!a}S@9Cm&9tugKF5G?htBpsFY*aUnOwQjO%9h9>ef1Ey{u z54)_T)vl}43Cl}A-X9gaE?^-m?f{H%o4jY?JJe+%I`R@~Gr-$&-?&C0|NaQmZsknk-F~ zrb{!W+0x zo+i(bXUTKqx$+V6k@E5KQhAxYTwWoslGn&<<@NF=d8@ol{+l97p;uTHgA^%>;fj34 zL`AKlPBC3EQ*ouDUeT=ZE3Q%m6|IUkMZ03LVx?k(qEm67VyEIk#lwn66^|=+EA}Y% zD)uQ3C|*?@QXEx$s`yUvgW{~>C&f9%uZrJeV`Am8v9Zcnb*wg47fZ+5V-sS3jQulC z8W$hui0dCWFm7<%WpTselH&5>E{_`(mmgOcR~%OoH#Tl^TwR_)g|h&>hbDQ^$fLB?NYndth!O{Q8%fZ)qeGI^{wjd>UY#%X^fggO`hg* zO|6F2%+}1&G;92tt2EbXR%>q5Y}DMWxka;0vqN*g<^j#4n#VOyYM$2Y*BsLv*L<$| zMsr3BwEeVFZHzWftI}$;@mi~Ps5VWTq0Q3fXh&)DwT0SZZHac4_G<0z+IzLTwR^OC zwfnROw6AIpXPG5D>GE~sbTvA+j@32lJh~=bv(B%Z zuUn|Yy2ZLBx~011y6bhFy1lxydaZt-K3$)s&(Y`UFV~OKm+NQfuhiG;S$(74qi@qM z(XY_2)UVR7*Kg3@q~E09qVLr2)IX$uME|({N&VCMefs_S1Nv9>pXk5U|DZps|5^Ww z{x>?BmeaAciq_Eaw1XZ%527!lhtWxNHeE!Q&|~Qd^hA0RT}wM@7wx85x{(gi?Q{pd zfL=^5p_kIj>2>rSbT@q$y`8>~-bp`5KTJPE@23yZuhWO=qx8G<`}A@8Tl#l{+MqS) z479;$FdM7}#^5mYHw-l787?=BGUOWy4aJ5M!&t+3L#d(6P;PJ=<{LH|x(!bo_8N{E z{xoWgR^w1(k}<`YZp<`h8)q7uj6P$FF=%Wxwi)LeR~XkC*Bdt&Z!+F)ywlie>^9zI zJZwB=f+m?M)}%D4O*T`KDaDj#$}nY_a!k3V5vK8`Qd60!+*DzzGS!%BO?9S5Q_!^9 z)MeUbI&L~?mYB6>o7rwoFb^;fG7m9ln6u0|=3Mg#^GNe(^H}p_bDi05UTj`x-fDiq z{G$0K^ULP_=2y(WTl!gK7KJ6wqOw>mLoCUbR7<)g(=yUB+A`MCXz^NBS~giWTW+)5 zVY$z;)AEGnCCeL@_btaQCoCUXPFeo4Mp;eP{?;;UrFEfonRTu8M(alF&DIC3&sv|e z?y|mMJ!Cy(|!P)^DxfTYt4h*_5`ywoKbd+h|*Xt;jaUR%R== zRoJR*HMUyYT-%Md$8E3M-nG4FJ7zm+``UKe_MPnq+gT=>kufx5Vk`{9IGFxSB9q2s zFj-6vQ_PHGCNLA33Z{ywVQLu{<70wME7QizXBIM;S^6I