From 197c2af5681c2a60d48f7550bd42f9aa8d3912f8 Mon Sep 17 00:00:00 2001 From: AceVest Date: Sat, 18 Mar 2017 19:46:45 +0800 Subject: [PATCH] Swift - Initialization --- .../Contents.swift | 254 ++++++++++++++++++ .../UserInterfaceState.xcuserstate | Bin 23809 -> 24458 bytes 2 files changed, 254 insertions(+) diff --git a/learn/AcePlay/AcePlay.playground/Pages/Initialization.xcplaygroundpage/Contents.swift b/learn/AcePlay/AcePlay.playground/Pages/Initialization.xcplaygroundpage/Contents.swift index cae7fb1..a9c2686 100644 --- a/learn/AcePlay/AcePlay.playground/Pages/Initialization.xcplaygroundpage/Contents.swift +++ b/learn/AcePlay/AcePlay.playground/Pages/Initialization.xcplaygroundpage/Contents.swift @@ -334,3 +334,257 @@ print("SixEggs: \(sixEggs.description)") // 需要注意的是此时的构造器代理的不是父类而是当前类 let oneMysterItem = RecipeIngredient() print("OneMysterItem: \(oneMysterItem.description)") + + + +class ShoppingListElement: RecipeIngredient { + var purchased = false + + override var description: String { + return "\(self.name) x \(self.quantity)" + (purchased ? " ✔" : " ✘") + } + + // 此时继承了三个构造器 + // init(name: String, quantity: Int) + // convenience init(name: String) + // init() +} + + +var breakfastList = [ + ShoppingListElement(), // 继承而来的默认构造器 + ShoppingListElement(), + ShoppingListElement(name: "Bacon"), // 继承的便利构造器 + ShoppingListElement(name: "Eggs", quantity: 6) // 继承的指定构造器 +] + + +breakfastList[1].purchased = true +breakfastList[1].name = "Orange Juice" + + +for v in breakfastList { + print(v.description) +} + +// 可失败的构造器 init? +// 语法为在init后添加一个`?`号,如init? 用return nil来表明失败 +// 可失败构造器的参数名和参数类型,不能与其它非可失败构造器的参数名,及其参数类型相同。 +// + +struct Animal { + let species: String + + init?(species: String) { + if species.isEmpty { + return nil + } + + self.species = species + } +} + +if let someCreature = Animal(species: "") { + print("An animal wat initialized with a species of \(someCreature.species)") +} else { + print("The anonymous creature could not be initialized") +} + + +// 枚举类型的可失败构造器 +enum TemperatureUnit { + case Kelvin + case Celius + case Fahrenheit + + init?(symbol: Character) { + switch symbol { + case "K": + self = .Kelvin + case "C": + self = .Celius + case "F": + self = .Fahrenheit + default: + return nil + } + } +} + + +let unknownUnit = TemperatureUnit(symbol: "A") +if unknownUnit == nil { + print("This is not a defined temperature unit") +} + + +// 带原始值的枚举类型的可失败构造器 +// 带原始值的枚举类型会自带一个可失败构造器init?(rawValue:) +enum TemperatureUnitWithRawValue: Character { + case Kelvin = "K" + case Celius = "C" + case Fahrenheit = "F" +} + +let unknownUnit2 = TemperatureUnitWithRawValue(rawValue: "X") +if unknownUnit2 == nil { + print("This is not a defined temperature unit") +} + + + +// 构造的失败传递 +// 类,结构体,枚举的可失败构造器可以横向代理到类型中的其他可失败构造器。类似的,子类的可失败构造器也能向上代理到父类的可失败构造器。 +// 如果代理到的其他可失败构造器触发构造失败,整个构造过程将立即终止,接下来的任何构造代码不会再被执行。 +// 可失败构造器也可以代理到其它的非可失败构造器 + +class Product { + var name: String + init?(name: String) { + if name.isEmpty { + return nil + } + self.name = name + } +} + +class CartItem: Product { + var quantity: Int + + init?(name: String, quantity: Int) { + if quantity < 1 { + return nil + } + + self.quantity = quantity + + super.init(name: name) + } +} + + +if let twoSocks = CartItem(name: "Sock", quantity: 2) { + print("Item: \(twoSocks.name), quantity: \(twoSocks.quantity)") +} + +let zeroShirts = CartItem(name: "Shirt", quantity: 0) +if zeroShirts == nil { + print("Unable to initialize zero shirts") +} + + +// 重写一个败构造器 +// 可以在子类中重写父类的可失败构造器 +// 也可以用子类的非可失败构造器重写一个父类的可失败构造器 +// 注意1:当用子类的非可失败构造器重写父类的可失败构造器时,向上代理到父类的可失败构造器的唯一方式是对父类的可失败构造器的返回值进行强制解包 +// 注意2:可以用非可失败构造器重写可失败构造器,但反过来却不行 + + + +class Document { // 定义一个类,其name成员必需为nil或非空字符串 + var name: String? + init() { // 该构造器创建一个name为nil的实例 + } + + init?(name: String) { // 该构造器创建一个name为非空字符串的实例 + if name.isEmpty { + return nil + } + + self.name = name + } +} + + +class AutomaticallyDocument: Document { + override init() { + super.init() + self.name = "[Unnamed]" + } + + + // 用非可失败的构造器重写父类的可失败构造器 + override init(name: String) { + super.init() + + if name.isEmpty { + self.name = "[Unnamed]" + } else { + self.name = name + } + } +} + + +// 可以在子类的非可失败构造器中使用强制解包来调用父类的可失败构造器 +class UntitledDocument: Document { + override init() { + super.init(name: "[Unnammed]")! + } +} + + + +// 可失败构造器 init! +// 一旦init!构造失败,则会触发一个断言 + + + + +// 必要构造器 +// 在类的构造器前添加required修饰符表明所有该类的子类都必须实现该构造器 +// 子类实现构造器前也得加required,不用加override +// 注意:如果子类继承的构造器能满足必要构造器的要求,则无须在子类中显式提供必要构造器的实现 +class SomeClass { + required init() { + + } +} + +class SomeSubClass: SomeClass { + required init() { // 不用再写override + + } +} + + + +// 通过闭包或函数设置属性的默认值 +// 注意: 如果使用闭包来初始化属性,在闭包执行时,实例的其它部分都还没有初始化。这意味着不能在闭包里访问其它属性,即使这些属性有默认值。同样,也不能使用隐式的self属性,或者调用任何实例方法。 +class SomeClosureClass { + var someProperty: String = { + return "a"+"b" // 返回类型必须与属性类型相同 + }() // 末尾的`()`很重要,这告诉Swift立即执行此闭包,如果不加这个就表示把闭包赋给属性 +} + + +struct CheckerBoard { + let boardColors: [Bool] = { + var tmpBoard = [Bool]() + var isBlack = false + for i in 1...8 { + for j in 1...8 { + tmpBoard.append(isBlack) + isBlack = !isBlack + } + isBlack = !isBlack + } + + return tmpBoard + }() + + func squareIsBlack(row: Int, col: Int) -> Bool? { + guard row >= 1 && row <= 8 && col >= 1 && row <= 8 else { + return nil + } + + return self.boardColors[(row-1)*8+col-1] + } +} + +let board = CheckerBoard() + +if let isBlack = board.squareIsBlack(row: 7, col: 7) { + print((isBlack ? "Black" : "White")) +} + diff --git a/learn/AcePlay/AcePlay.playground/playground.xcworkspace/xcuserdata/Ace.xcuserdatad/UserInterfaceState.xcuserstate b/learn/AcePlay/AcePlay.playground/playground.xcworkspace/xcuserdata/Ace.xcuserdatad/UserInterfaceState.xcuserstate index 865a7a845c1dd81cba79be1c02a3fd3b147b2ecb..1389b401d573fc3a705cb698621b06748decd45a 100644 GIT binary patch delta 12520 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 L^&B*PiZ=cqHvKnf delta 12219 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 U#>PL30YdIiUXlB==~ZC*f1cgWeE