[protocol协议]
protocol:只定义,不实现
-》定义,只是为了说明,能做什么,即只有函数定义,没有函数实现
-》其他的,遵循,符合,此protocol协议的,类,结构体,枚举,自己去实现
-》任何实现了此协议的类型,都可以叫做 conform遵循 此协议
protocol定义:
protocol ExampleProtocol {
var simpleDescription: String { get }
func adjust()
}实现了此协议的类:
class SimpleClass: ExampleProtocol {
var simpleDescription: String = "A very simple class."
var anotherProperty: Int = 69105
func adjust() {
simpleDescription += " Now 100% adjusted."
}
}
var a = SimpleClass()
a.adjust()
let aDescription = a.simpleDescription[delegate,delegation代理]
代理是一种设计模式。
代理是允许一个类或结构体能够把其自己的一部分责任,转移,到另外一个类型的实例去,处理
这个类,被代理者,和,另外一个类型,代理者,之前的关系,就有点像:
一个普通人,和一个小管家:普通人的部分事情,要交由小管家去处理
这个代理模式,是通过:
定义一个协议,该协议封装了代理的职责(函数)
而实现的。
由此,遵循了类型,作为代理,保证提供了被代理的功能。
代理可以用于被响应特定的动作,或者(无需知道外部数据格式就可以)从外部源获取数据
举例:
protocol DiceGame {
var dice: Dice { get }
func play()
}
protocol DiceGameDelegate {
func gameDidStart(game: DiceGame)
func game(game: DiceGame, didStartNewTurnWithDiceRoll diceRoll: Int)
func gameDidEnd(game: DiceGame)
}然后实现了DiceGame这个Protocol的类中,定义和实现了对应的DiceGameDelegate:
class SnakesAndLadders: DiceGame {
let finalSquare = 25
let dice = Dice(sides: 6, generator: LinearCongruentialGenerator())
var square = 0
var board: [Int]
init() {
board = [Int](count: finalSquare + 1, repeatedValue: 0)
board[03] = +08; board[06] = +11; board[09] = +09; board[10] = +02
board[14] = -10; board[19] = -11; board[22] = -02; board[24] = -08
}
var delegate: DiceGameDelegate?
func play() {
square = 0
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 DiceGameTracker: DiceGameDelegate {
var numberOfTurns = 0
func gameDidStart(game: DiceGame) {
numberOfTurns = 0
if game is SnakesAndLadders {
print("Started a new game of Snakes and Ladders")
}
print("The game is using a \(game.dice.sides)-sided dice")
}
func game(game: DiceGame, didStartNewTurnWithDiceRoll diceRoll: Int) {
++numberOfTurns
print("Rolled a \(diceRoll)")
}
func gameDidEnd(game: DiceGame) {
print("The game lasted for \(numberOfTurns) turns")
}
}然后具体实例化,如何使用:
let tracker = DiceGameTracker() let game = SnakesAndLadders() game.delegate = tracker game.play() // Started a new game of Snakes and Ladders // The game is using a 6-sided dice // Rolled a 3 // Rolled a 5 // Rolled a 4 // Rolled a 5 // The game lasted for 4 turns
相关参考资料
关于protocol,抽空先去看看官网的解释:
Start Developing iOS Apps (Swift): Learn the Essentials of Swift
The Swift Programming Language (Swift 2): Protocols
抽空去看看:
Swift 2 Tutorial Part 3: Tuples, Protocols, Delegates, and Table Views – Ray Wenderlich
貌似解释的还可以。
抽空好好学学这方面内容。
之前的整理内容,详见有道云笔记中的:
【整理】MVC架构和Target-Action,delegate,protocol的详细解释
转载请注明:在路上 » [整理]Swift的代理delegate,协议protocol