From 4baee31a391ea0707b25952626dc087139ea8855 Mon Sep 17 00:00:00 2001 From: AceVest Date: Sun, 19 Mar 2017 20:51:11 +0800 Subject: [PATCH] Swift - ErrorHandling TypeCasting NestedTypes Extensions Protocols --- .../Contents.swift | 150 ++++++++++++++ .../Contents.swift | 188 ++++++++++++++++++ .../Contents.swift | 54 +++++ .../Protocols.xcplaygroundpage/Contents.swift | 108 ++++++++++ .../Contents.swift | 129 ++++++++++++ .../AcePlay.playground/contents.xcplayground | 5 + .../UserInterfaceState.xcuserstate | Bin 26940 -> 28408 bytes .../WorkspaceSettings.xcsettings | 16 ++ 8 files changed, 650 insertions(+) create mode 100644 learn/AcePlay/AcePlay.playground/Pages/ErrorHandling.xcplaygroundpage/Contents.swift create mode 100644 learn/AcePlay/AcePlay.playground/Pages/Extensions.xcplaygroundpage/Contents.swift create mode 100644 learn/AcePlay/AcePlay.playground/Pages/NestedTypes.xcplaygroundpage/Contents.swift create mode 100644 learn/AcePlay/AcePlay.playground/Pages/Protocols.xcplaygroundpage/Contents.swift create mode 100644 learn/AcePlay/AcePlay.playground/Pages/TypeCasting.xcplaygroundpage/Contents.swift create mode 100644 learn/AcePlay/AcePlay.playground/playground.xcworkspace/xcuserdata/Ace.xcuserdatad/WorkspaceSettings.xcsettings diff --git a/learn/AcePlay/AcePlay.playground/Pages/ErrorHandling.xcplaygroundpage/Contents.swift b/learn/AcePlay/AcePlay.playground/Pages/ErrorHandling.xcplaygroundpage/Contents.swift new file mode 100644 index 0000000..47bf506 --- /dev/null +++ b/learn/AcePlay/AcePlay.playground/Pages/ErrorHandling.xcplaygroundpage/Contents.swift @@ -0,0 +1,150 @@ +//: [Previous](@previous) + +import Foundation + +var str = "Hello, Error Handling" + +//: [Next](@next) + + +// 错误用符合Error协议的类型的值来表示。这个空协议表明该类型可以用于错误处理 + +enum VendingMachineError: Error { + case invalidSelection + case outOfSock + case insufficientFunds(coinsNeeded: Int) +} + + + +struct Item { + var price: Int + var count: Int +} + +class VendingMachine { + var inventory = [ + "Candy Bar": Item(price: 5, count: 100), + "Chips": Item(price: 9, count: 9), + "Pretzels" :Item(price: 7, count: 11) + ] + + var coinsDeposited = 0 + + func dispenseSnack(snack: String) { + print("Dispensing \(snack)") + } + + func vend(itemNamed name: String) throws { + guard let item = inventory[name] else { + throw VendingMachineError.invalidSelection + } + + guard item.count > 0 else { + throw VendingMachineError.outOfSock + } + + guard item.price <= coinsDeposited else { + throw VendingMachineError.insufficientFunds(coinsNeeded: item.price - coinsDeposited) + } + + coinsDeposited -= item.price + + inventory[name]!.count -= 1 + print("Dispensing \(name)") + } +} + + +let favoriteSnack = [ + "Alice": "Chips", + "Bob": "Licorice", + "Eve": "Pretzels" +] + + + +func buyFavoriteSnack(name: String, vendMachine: VendingMachine) throws { + let snackName = favoriteSnack[name] ?? "Candy Bar" + try vendMachine.vend(itemNamed: snackName) // 因为vend会抛出异常,所以前面加try关键字 +} + + +struct PurchasedSnack { + let name: String + + init(name: String, vendingMachine: VendingMachine) throws { // 构造器也可抛出异常 + try vendingMachine.vend(itemNamed: name) + self.name = name + } +} + + + +var vendingMachine = VendingMachine() +vendingMachine.coinsDeposited = 3 +do { + try buyFavoriteSnack(name: "Alice", vendMachine: vendingMachine) +} catch VendingMachineError.invalidSelection { + print("Invalid Selection") +} catch VendingMachineError.outOfSock { + print("Out of sock") +} catch VendingMachineError.insufficientFunds(let coinsNeeded) { + print("Insufficient funds. Please insert an additional \(coinsNeeded) coins") +} + + +// 将错误转换成可选值 +// 可以使用try?通过将错误转换成一个可选值来处理错误。如果在评估try?表达式时一个错误被抛出,那么表达式的值就是nil +//func someThrowingFunction() throws -> Int { +// // ... +//} +// +//let x = try? someThrowingFunction() +// +//let y: Int? +//do { +// y = try someThrowingFunction() +//} catch { +// y = nil +//} +// 如果someThrowingFunction()抛出一个错误,x和y的值是nil。否则x和y的值就是该函数的返回值。 +// 注意,无论someThrowingFunction()的返回值类型是什么类型,x和y都是这个类型的可选类型。例子中此函数返回一个整型,所以x和y是可选整型。 + + +// 禁用错误传递 +// 有时知道某个throwing函数实际上在运行时是不会抛出错误的,可以在表达式前面写try!来禁用错误传递 +// 这会把调用包装在一个不会有错误抛出的运行时断言中 +// 如果真的抛出了错误,会得到一个运行时错误 + + + + +// 指定清理操作 +func testDefer() { + print("\(#function):\(#line)") + defer { + print("Top Level Defer") + } + + print("\(#function):\(#line)") + if arc4random_uniform(100) < 50 { + print("\(#function):\(#line)") + defer { + print("Sub Level if Defer") + } + print("\(#function):\(#line)") + } else { + print("\(#function):\(#line)") + defer { + print("Sbu Level else Defer") + } + print("\(#function):\(#line)") + } + + print("\(#function):\(#line)") + print("End of Function \(#function)") +} + + +testDefer() diff --git a/learn/AcePlay/AcePlay.playground/Pages/Extensions.xcplaygroundpage/Contents.swift b/learn/AcePlay/AcePlay.playground/Pages/Extensions.xcplaygroundpage/Contents.swift new file mode 100644 index 0000000..4e753f7 --- /dev/null +++ b/learn/AcePlay/AcePlay.playground/Pages/Extensions.xcplaygroundpage/Contents.swift @@ -0,0 +1,188 @@ +//: [Previous](@previous) + +import Foundation + +var str = "Hello, Extensions" + +//: [Next](@next) + + +// 扩展 就是为一个已有的类、结构体、枚举类型或者协议类型添加新功能。这包括在没有权限获取原始源代码的情况下扩展类型的能力 + +// Swift 中的扩展可以: +// 1. 添加计算型属性和计算型类型属性 +// 2. 定义实例方法和类型方法 +// 3. 提供新的构造器 +// 4. 定义下标 +// 5. 定义和使用新的嵌套类型 +// 6. 使一个已有类型符合某个协议 + + +// 在 Swift 中,你甚至可以对协议进行扩展,提供协议要求的实现,或者添加额外的功能,从而可以让符合协议的类型拥有这些功能 +// 注意:扩展可以为一个类型添加新的功能,但是不能重写已有的功能。 + +// 语法 +// +//extension SomeType { +// somecode +//} + +// +//可以通过扩展来扩展一个已有类型,使其采纳一个或多个协议。在这种情况下,无论是类还是结构体,协议名字的书写方式完全一样: +// +//extension SomeType: SomeProtocol, AnotherProctocol { +// // 协议实现写到这里 +//} + +// 注意: 如果你通过扩展为一个已有类型添加新功能,那么新功能对该类型的所有已有实例都是可用的,即使它们是在这个扩展定义之前创建的 + + + +// 扩展计算型属性 +// 转换成米 +extension Double { + var km: Double { return self*1000 } + var m: Double { return self } + var cm: Double { return self/100 } + var ft: Double { return self/3.28084 } +} + +var tenThousandFeet = 10_000.ft +print("Ten thousand feets is \(tenThousandFeet) meters") + +let aMarathon = 42.km + 195.m +print("a marathon is \(aMarathon) meters long") + + +// 注意: 扩展可以添加新的计算型属性,但是不可以添加存储型属性,也不可以为已有属性添加属性观察器 + + + +// 扩展构造器 +// 扩展能为类添加新的便利构造器,但是它们不能为类添加新的指定构造器或析构器。指定构造器和析构器必须总是由原始的类实现来提供 +// 如果使用扩展为一个值类型添加构造器,同时该值类型的原始实现中未定义任何定制的构造器且所有存储属性提供了默认值,那么就可以在扩展中的构造器里调用默认构造器和逐一成员构造器。 +struct Size { + var width: Double = 0.0 + var height: Double = 0.0 +} + +struct Point { + var x: Double = 0.0 + var y: Double = 0.0 +} + + +struct Rect { + var origin = Point() + var size = Size() +} + + +var defaultRect = Rect() +var originRect = Rect(origin: Point(x: 2.0, y:2.0), size: Size(width: 5.0, height: 5.0)) + + +// 可以为Rect扩展一个指定中心点和Size的构造器 +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) + } +} + +var centerRect = Rect(center: Point(x: 0.0, y: 0.0), size: Size(width: 5.0, height: 5.0)) + + +// 扩展方法 + +extension Int { + func repeatTask(task: (Int) -> Void) { + for i in 0.. Int { + self = self * self + return self + } +} + +var someInt = 3 +print(someInt.square()) +print(someInt) + + +// 扩展下标 +extension Int { + subscript(index: Int) -> Int { + + var base = 1 + + for _ in 1.. 0: + return .Positive + case Int.min..<0 : + return .Negative + default: + return .Zero + } + } +} + + +func printIntegerKinds(_ numbers: [Int]) { + for n in numbers { + var s: String = "" + switch n.kind { + case .Negative: + s += "-" + case .Zero: + s += " " + case .Positive: + s += "+" + } + + s += "\(n.kind)" + + print(s) + } +} + + +var numbers: [Int] = [1, 2, 3, -1, 0, -8] +printIntegerKinds(numbers) \ No newline at end of file diff --git a/learn/AcePlay/AcePlay.playground/Pages/NestedTypes.xcplaygroundpage/Contents.swift b/learn/AcePlay/AcePlay.playground/Pages/NestedTypes.xcplaygroundpage/Contents.swift new file mode 100644 index 0000000..22309b0 --- /dev/null +++ b/learn/AcePlay/AcePlay.playground/Pages/NestedTypes.xcplaygroundpage/Contents.swift @@ -0,0 +1,54 @@ +//: [Previous](@previous) + +import Foundation + +var str = "Hello, NestTypes" + +//: [Next](@next) + + +struct BlackjackCard { + // 嵌套的 Suit 枚举 + enum Suit: Character { + case Spades = "♠", Hearts = "♡", Diamonds = "♢", Clubs = "♣" + } + + // 嵌套的 Rank 枚举 + enum Rank: Int { + case Two = 2, Three, Four, Five, Six, Seven, Eight, Nine, Ten + case Jack, Queen, King, Ace + struct Values { + let first: Int, second: Int? + } + var values: Values { + switch self { + case .Ace: + return Values(first: 1, second: 11) + case .Jack, .Queen, .King: + return Values(first: 10, second: nil) + default: + return Values(first: self.rawValue, second: nil) + } + } + } + + // BlackjackCard 的属性和方法 + let rank: Rank, suit: Suit + var description: String { + var output = "suit is \(suit.rawValue)," + output += " value is \(rank.values.first)" + if let second = rank.values.second { + output += " or \(second)" + } + return output + } +} + +let theAceOfSpades = BlackjackCard(rank: .Ace, suit: .Spades) +print("theAceOfSpades: \(theAceOfSpades.description)") + + +// 引用嵌套类型 +// 在外部引用嵌套类型时,在嵌套类型的类型名前加上其外部类型的类型名作为前缀 +let heartsSymbol = BlackjackCard.Suit.Hearts.rawValue +print(heartsSymbol) diff --git a/learn/AcePlay/AcePlay.playground/Pages/Protocols.xcplaygroundpage/Contents.swift b/learn/AcePlay/AcePlay.playground/Pages/Protocols.xcplaygroundpage/Contents.swift new file mode 100644 index 0000000..fa880fd --- /dev/null +++ b/learn/AcePlay/AcePlay.playground/Pages/Protocols.xcplaygroundpage/Contents.swift @@ -0,0 +1,108 @@ +//: [Previous](@previous) + +import Foundation + +var str = "Hello, Protocols" + +//: [Next](@next) + +//协议语法 +//协议的定义方式与类、结构体和枚举的定义非常相似: +// +//protocol SomeProtocol { +// // 这里是协议的定义部分 +//} +//要让自定义类型遵循某个协议,在定义类型时,需要在类型名称后加上协议名称,中间以冒号(:)分隔。遵循多个协议时,各协议之间用逗号(,)分隔: +// +//struct SomeStructure: FirstProtocol, AnotherProtocol { +// // 这里是结构体的定义部分 +//} +//拥有父类的类在遵循协议时,应该将父类名放在协议名之前,以逗号分隔: +// +//class SomeClass: SomeSuperClass, FirstProtocol, AnotherProtocol { +// // 这里是类的定义部分 +//} + + +//协议可以要求遵循协议的类型提供特定名称和类型的实例属性或类型属性。协议不指定属性是存储型属性还是计算型属性,它只指定属性的名称和类型。此外,协议还指定属性是可读的还是可读可写的。 +// +//如果协议要求属性是可读可写的,那么该属性不能是常量属性或只读的计算型属性。如果协议只要求属性是可读的,那么该属性不仅可以是可读的,如果代码需要的话,还可以是可写的。 +// +//协议总是用 var 关键字来声明变量属性,在类型声明后加上 { set get } 来表示属性是可读可写的,可读属性则用 { get } 来表示: +// +//protocol SomeProtocol { +// var mustBeSettable: Int { get set } +// var doesNotNeedToBeSettable: Int { get } +//} +//在协议中定义类型属性时,总是使用 static 关键字作为前缀。当类类型遵循协议时,除了 static 关键字,还可以使用 class 关键字来声明类型属性: +// +//protocol AnotherProtocol { +// static var someTypeProperty: Int { get set } +//} + + + +protocol FullNamed { + var fullName: String { get } +} + +struct Person: FullNamed { + var fullName: String +} + +let john = Person(fullName: "John") + + +class Starship: FullNamed { + var name: String + var prefix: String? + + init(name: String, prefix: String? = nil) { + self.name = name + self.prefix = prefix + } + + var fullName: String { + return "\(prefix ?? "") \(name)" + } +} + +var ncc1701 = Starship(name: "Enterprise", prefix: "USS") +print(ncc1701.fullName) + + + + +// 方法要求 +// 协议可以要求遵循协议的类型实现某些指定的实例方法或类方法。这些方法作为协议的一部分,像普通方法一样放在协议的定义中,但是不需要大括号和方法体。 +// 可以在协议中定义具有可变参数的方法,和普通方法的定义方式相同。但是,不支持为协议中的方法的参数提供默认值。 + + +//正如属性要求中所述,在协议中定义类方法的时候,总是使用 static 关键字作为前缀。当类类型遵循协议时,除了 static 关键字,还可以使用 class 关键字作为前缀: +// +//protocol SomeProtocol { +// static func someTypeMethod() +//} + + +protocol RandomNumberGenerator { + func random() -> Double +} + + +class LinearCongruentialGenerator: RandomNumberGenerator { + var lastRandom = 42.0 + let m = 139968.0 + let a = 3877.0 + let c = 29573.0 + + func random() -> Double { + lastRandom = ((lastRandom * a + c).truncatingRemainder(dividingBy:m)) + return lastRandom / m + } +} + +let generator = LinearCongruentialGenerator() +print("Here is a random number: \(generator.random())") +print("Here is another random number: \(generator.random())") + diff --git a/learn/AcePlay/AcePlay.playground/Pages/TypeCasting.xcplaygroundpage/Contents.swift b/learn/AcePlay/AcePlay.playground/Pages/TypeCasting.xcplaygroundpage/Contents.swift new file mode 100644 index 0000000..15f907b --- /dev/null +++ b/learn/AcePlay/AcePlay.playground/Pages/TypeCasting.xcplaygroundpage/Contents.swift @@ -0,0 +1,129 @@ +//: [Previous](@previous) + +import Foundation + +var str = "Hello, TypeCasting" + +//: [Next](@next) + + +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) + } +} + + +// 这个数组将会被推断为MediaItem类型 +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") +] + + + +var movieCount = 0 +var songCount = 0 + +for i in library { + if i is Movie { + movieCount += 1 + } else if i is Song { + songCount += 1 + } +} + +print("Media Library contains \(movieCount) Movies and \(songCount) Songs") +print("------------------------------------------------------------------") + + + +// 向下转型 +// 某类型的一个常量或变量可能在幕后实际上属于一个子类。当确定是这种情况时,你可以尝试向下转到它的子类型,用类型转换操作符(as? 或 as!) +// 因为向下转型可能会失败,类型转型操作符带有两种不同形式。条件形式as? 返回一个你试图向下转成的类型的可选值。强制形式 as! 把试图向下转型和强制解包转换结果结合为一个操作 + +for m in library { + if let movie = m as? Movie { + print("Movie: \(movie.name) directed by \(movie.director)") + } else if let song = m as? Song { + print("Song: \(song.name) by \(song.artist)") + } +} + + + + + +// Any和AnyObject的类型转换 +// Swift为不确定类型提供了两种特殊的类型别名 +// 1. Any可以表示任何类型,包括函数类型 +// 2. AnyObject可以表示任何类类型的实例 + +var things = [Any]() +things.append(99) +things.append(0) +things.append(2.718281828459) +things.append(0.0) +things.append("Hello Swift") +things.append((3, 4)) +things.append(Movie(name: "Citizen Kane", director: "Orson Welles")) +things.append( { (name: String) -> String in "Hello \(name)!" } ) + + +print("------------------------------------------------------------------") + +for t in things { + switch t { + case 0 as Int: + print("zero as Int") + case 0 as Double: + print("zero as 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: + print("some other double value that i do not want to print") + case let someStr as String: + print("a string value of \"\(someStr)\"") + case let (x, y) as (Int, Int) : + print("an (x, y) point at (\(x), \(y)") + case let movie as Movie: + print("a movie named \(movie.name) directed by \(movie.director)") + case let strConverter as (String) -> String : + print(strConverter("Ace")) + default: + print("Something else") + } +} + + +// 注意:Any类型可以表示所有类型的值,包括可选类型 +// Swift会在你用Any类型来表示一个可选值的时候,给一个警告。如果确实想使用Any类型来承载可选值,你可以使用as操作符显式转换为Any +let optionalNumber: Int? = 3 +// things.append(optionalNumber) // 会有warning +things.append(optionalNumber as Any) // 不会有warning diff --git a/learn/AcePlay/AcePlay.playground/contents.xcplayground b/learn/AcePlay/AcePlay.playground/contents.xcplayground index bc794cb..e710ae5 100644 --- a/learn/AcePlay/AcePlay.playground/contents.xcplayground +++ b/learn/AcePlay/AcePlay.playground/contents.xcplayground @@ -16,5 +16,10 @@ + + + + + \ No newline at end of file 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 c4b2fc51b59995cfa400e1254076717c83d2968b..5ea7ff692d69d081ee2ba99fa007630bd1772563 100644 GIT binary patch literal 28408 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 IUw-oc0T_ + + + + BuildLocationStyle + UseAppPreferences + CustomBuildLocationType + RelativeToDerivedData + DerivedDataLocationStyle + Default + IssueFilterStyle + ShowActiveSchemeOnly + LiveSourceIssuesEnabled + + + -- 2.44.0