diff --git a/03_demo.txt b/03_demo.txt new file mode 100644 index 0000000000000000000000000000000000000000..b45f36477004ffdc4ade303ed4cbc522f3875f8d --- /dev/null +++ b/03_demo.txt @@ -0,0 +1,97 @@ +```go +func changeB(a:String, b: inout String) { + b = "\(a)\(b)" +} +var s="this" +changeB(a:"changing ", b:&s) +print(s) + + + +//===================================================================== + +func outer() -> (Int) -> Int { + var incr = 0 + func inner(_ a:Int) -> Int { + incr += 1 + return a+incr + } + return inner + } +let x = outer() +x(33) + +//===================================================================== + +Array::sorted(by: (T,T)->Bool) + + let nums = [7,5,14,12,16] + + // Sort with inferred types + let snums = nums.sorted(by:{a,b in a>b}) + + // Sort with positional parameters + let snums2 = nums.sorted(by:{$0>$1}) + + // Sort with function name + let snums3 = nums.sorted(by:>) + + // Sort with a trailing closure + let snums4 = nums.sorted() {$0>$1} + + // Sort with parentheses omitted + let snums5 = nums.sorted {$0>$1} + +//===================================================================== + + +enum Earthsea: CaseIterable { + case AWizardOfEarthsea + case TheTombsOfAtuan + case TheFarthestShore + case Tehanu +} + +for book in Earthsea.allCases { + print(book) +} + +//===================================================================== + +struct Point { + var x: Int = 0 + var y: Int = 0 +} +let p = Point(x:3, y: 4) +let p2 = Point(x:4, y: 5) + +enum Shape { + case circle(center:Point, radius:Double) + case rect(lowerLeft:Point, upperRight:Point) +} + +let s = Shape.circle(center:p, radius:1.5) + +switch s { + case .circle(let c, let r): + print("It's a circle \(c) \(r)") + + case let .rect(ll, ur): + print("Just a rect \(ll) \(ur)") + + default: + print("default") +} + +let sr = Shape.rect(lowerLeft: p, upperRight: p2) +switch sr { + case .circle(let c, let r): + print("It's a circle \(c) \(r)") + + case let .rect(ll, ur): + print("Just a rect \(ll) \(ur)") + + default: + print("default") +} +``` diff --git a/exercises-9-9.md b/exercises-9-9.md new file mode 100644 index 0000000000000000000000000000000000000000..22202c5575b7ebf8485fe6490587cd39fdfe65f4 --- /dev/null +++ b/exercises-9-9.md @@ -0,0 +1,177 @@ +struct Stack<Element> { + var items = [Element]() + mutating func push(_ item: Element) { + items.append(item) + } + mutating func pop() -> Element { + return items.removeLast() + } +} + + +var t = Stack<Int>() + +print(t) +t.push(3) +t.push(4) +print(t.pop()) + +var s = Stack<String>() + +s.push("nice") +print(s.pop()) + +//===================================================================== + + +extension Stack { + var top: T? { + return items.isEmpty ? nil : items[0] + } +} + +if let x = t.top { + print("there is another int") +} + +if let y = s.top { + print("there is another string") +} + +//===================================================================== + +enum MyError: Error { + case bad1 + case bad2 +} + +func blah() throws { + defer { print("I've got a deferment") } + defer { print("Second deferment") } + + throw MyError.bad1 + + print("regular blah") +} + +do { + try blah() +} catch let e where e is MyError { + print("my bad \(e)") +} + + + + +//===================================================================== + +class Person { // references: 0 + let name:String + init(name: String) { self.name = name } + var apartment: Apartment? + deinit { print("\(name) is being deinitialized") } +} + +class Apartment { // references: 0 + let unit: String + init(unit: String) { self.unit = unit } + var tenant: Person? + deinit { print("Apartment \(unit) is being deinitialized") } +} + +var john:Person? = Person(name: "John Doe") +var unit4A:Apartment? = Apartment(unit: "4A") +john!.apartment = unit4A +unit4A!.tenant = john + +john = nil +unit4A = nil + + +// make either ref weak and they go away + +// make .tenant unowned (.apartment strong) + +john = nil +print(unit4A!.tenant) // crash + +//===================================================================== + + +class Country { + let name: String + var capitalCity: City? = nil + init(nameIn: String, capitalName: String) { + name = nameIn + capitalCity = City(nameIn: capitalName, countryIn: self) + } + deinit { + print("\(name) deiniting") + } +} + +class City { + let name: String + unowned let country: Country + init(nameIn: String, countryIn: Country) { + name = nameIn + country = countryIn + } + deinit { + print("\(name) deiniting") + } +} + +var country :Country? = Country(nameIn: "Bangladesh", capitalName: "Dhaka") + + +// need to make capitalCity OPTIONAL so init can complete + +// still have loop, so make country UNOWNED + +//===================================================================== + +class Person { + var firstName: String? + var lastName: String? + var fullName: ()->String = { + return ("\(self.firstName!) \(self.lastName!)") + } + init(f: String, l: String) { + firstName = f + lastName = l + } + deinit { + print("deiniting") + } +} + +var x:Person? = Person(f: "pete", l: "keleher") + +print(x!.fullName()) + +x = nil + +print("done") + +// Add 'lazy' to def of fullname, allow not violate safety check. +// add " [unowned self] in" (a "capture list") to fullName closure to avoid strong reference loop: + +class Person { + var firstName: String? + var lastName: String? + lazy var fullName: ()->String = { + [unowned self] + return ("\(self.firstName!) \(self.lastName!)") + } + init(f: String, l: String) { + firstName = f + lastName = l + } + deinit { + print("deiniting") + } +} + +//===================================================================== +