最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

[整理]Swift的代理delegate,协议protocol

Swift crifan 3674浏览 0评论

[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

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
84 queries in 0.170 seconds, using 22.10MB memory