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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 delta 12219 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