From 81ab4a381a41c08fbbe2efc4aafcf5c7243f7e08 Mon Sep 17 00:00:00 2001 From: acevest Date: Mon, 3 Apr 2017 14:09:43 +0800 Subject: [PATCH] ... --- .../Protocols.xcplaygroundpage/Contents.swift | 181 +++++++++++++++++- .../UserInterfaceState.xcuserstate | Bin 29904 -> 8024 bytes learn/go/interfaces.go | 2 +- 3 files changed, 178 insertions(+), 5 deletions(-) diff --git a/learn/AcePlay/AcePlay.playground/Pages/Protocols.xcplaygroundpage/Contents.swift b/learn/AcePlay/AcePlay.playground/Pages/Protocols.xcplaygroundpage/Contents.swift index 59ef2ef..8b4a182 100644 --- a/learn/AcePlay/AcePlay.playground/Pages/Protocols.xcplaygroundpage/Contents.swift +++ b/learn/AcePlay/AcePlay.playground/Pages/Protocols.xcplaygroundpage/Contents.swift @@ -109,10 +109,6 @@ print("Here is another random number: \(generator.random())") - - - - // 类类型专属协议 protocol SomeClassOnlyProtocol: class { func haha() -> String @@ -212,5 +208,182 @@ extension RandomNumberGenerator { let generator1 = LinearCongruentialGenerator() print(generator1.randomBool()) +// Mutating 方法要求 +// 实现协议中的 mutating 方法时,若是类类型,则不用写 mutating 关键字。而对于结构体和枚举,则必须写 mutating 关键字。 + +protocol Togglable { + mutating func toggle() +} + + +enum OnOffSwitch: String, Togglable { + case On + case Off + + mutating func toggle() { + switch self { + case .Off: + self = .On + case .On: + self = .Off + } + } +} + + +var lightSwith = OnOffSwitch.Off +lightSwith.toggle() +print(lightSwith) + + +// 构造器要求 +// 协议可以要求遵循协议的类型实现指定的构造器 +// 在协议的定义里写构造器的声明不需要写花括号和构造器的实体 + +protocol SomeProtocol { + init(someParameter: Int) +} + +// 在遵循协议的类中实现构造器,无论是作为指定构造器,还是作为便利构造器。无论哪种情况,都必须为构造器实现标上 required 修饰符 +// 因为使用 required 修饰符可以确保所有子类也必须提供此构造器实现,从而也能符合协议。 +// 注意如果`类`已经被标记为final,那么不需要在协议构造器的实现中使用required修饰符,因为final类不能有子类 +class SomeClass: SomeProtocol { + required init(someParameter: Int) { + + } +} + + + +// 如果一个子类重写了父类的指定构造器,并且该构造器满足了某个协议的要求,那么该构造器的实现需要同时标注required和override修饰符 +protocol InitProtocol { + init() +} + +class InitBaseClass { + init() { } +} + + +// 写继承列表应该先写类,再写协议 +class InitClass: InitBaseClass, InitProtocol { + override required init() { } +} + + +// 可失败构造器要求 +// 遵循协议的类型可以通过可失败构造器(init?)或非可失败构造器(init)来满足协议中定义的可失败构造器要求 +// 协议中定义的非可失败构造器要求可以通过非可失败构造器(init)或隐式解包可失败构造器(init!)来满足。 + + +// 协议作为类型 +// 作为函数、方法或构造器中的参数类型或返回值类型 +// 作为常量、变量或属性的类型 +// 作为数组、字典或其他容器中的元素类型 +class Dice { + let sides: Int + let generator: RandomNumberGenerator + + init(sides: Int, generator: RandomNumberGenerator) { + self.sides = sides + self.generator = generator + } + + func roll() -> Int { + return Int(generator.random()*Double(self.sides)) + 1 + } +} + +let dice = Dice(sides: 6, generator: LinearCongruentialGenerator()) +print("Roll: \(dice.roll())") +print("Roll: \(dice.roll())") +print("Roll: \(dice.roll())") +print("Roll: \(dice.roll())") + + +// 委托(代理)模式 +// 委托模式允许类或结构体将一些需要它们负责的功能委托给其他类型的实例 +// 委托模式定义协议来封装那些需要被委托的功能,这样就能确保遵循协议的类型能提供这些功能 +// 委托模式可以用来响应特定的动作,或者接收外部数据源提供的数据,而无需关心外部数据源的类型 + + +// DiceGame 协议可以被任意涉及骰子的游戏遵循。 +protocol DiceGame { + var dice: Dice { get } + func Play() +} + +// DiceGameDelegate 协议可以被任意类型遵循,用来追踪 DiceGame 的游戏过程 +protocol DiceGameDelegate { + func GameDidStart(_ game: DiceGame) + func game(_ game: DiceGame, didStartNewTurnWithDiceRoll diceRoll: Int) + func GameDidEnd(_ game: DiceGame) +} + + +class SnakesAndLadders: DiceGame { + let dice = Dice(sides: 6, generator: LinearCongruentialGenerator()) + let finalSquare = 25 + + var board: [Int] + var delegate: DiceGameDelegate? + + init() { + board = [Int](repeating:0, count: finalSquare + 1) + board[03] = +08; board[06] = +11; board[09] = +09; board[10] = +02 + board[04] = -10; board[19] = -11; board[22] = -02; board[24] = -08 + } + + func Play() { + var square = 0 + + // 因为 delegate 是一个 DiceGameDelegate 类型的可选属性, + // 因此在 play() 方法中通过可选链式调用来调用它的方法 + // 若 delegate 属性为 nil,则调用方法会优雅地失败,并不会产生错误 + delegate?.GameDidStart(self) + gameLoop: while square != finalSquare { + let diceRoll = dice.roll() + delegate?.game(self, didStartNewTurnWithDiceRoll: diceRoll) + switch square + diceRoll { + case finalSquare: + break gameLoop + case let newSquare where newSquare > finalSquare: + continue gameLoop + default: + square += diceRoll + square += board[square] + } + } + delegate?.GameDidEnd(self) + } +} + +class DiceTracker: DiceGameDelegate { + var numberOfTurns = 0 + func GameDidStart(_ game: DiceGame) { + if game is SnakesAndLadders { + print("Start a new game of Snakes and Ladders") + } + print("The game is using a \(game.dice.sides)-sided game") + } + func game(_ game: DiceGame, didStartNewTurnWithDiceRoll diceRoll: Int) { + numberOfTurns += 1 + print("Rolled a \(diceRoll)") + } + func GameDidEnd(_ game: DiceGame) { + print("Game lasts for \(numberOfTurns) turns") + } +} + +let tracker = DiceTracker() +let game = SnakesAndLadders() + +game.delegate = tracker +game.Play() + +// 通过扩展添加协议一致性 +protocol TextRepesentable { + var textualDescription: String { get } +} 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 957e76c24042a8a0efe63b02a4286519828247b0..b35f29100ff6b97f21fea7f96da6e7089607c721 100644 GIT binary patch literal 8024 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 literal 29904 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 diff --git a/learn/go/interfaces.go b/learn/go/interfaces.go index 304af7a..5ef29ed 100644 --- a/learn/go/interfaces.go +++ b/learn/go/interfaces.go @@ -35,7 +35,7 @@ func (r *Round) Area() float64 { type Rectangular struct { - width float64 + width float64 height float64 } -- 2.44.0