美文网首页
Swift 2 学习笔记 19.面向协议的编程

Swift 2 学习笔记 19.面向协议的编程

作者: Maserati丶 | 来源:发表于2018-11-28 22:15 被阅读0次

课程来自慕课网liuyubobobo老师


面向协议的编程
  • 扩展协议和默认实现
protocol Record: CustomStringConvertible {
    var wins: Int {get}
    var losses: Int {get}
    
    func winningPercent() -> Double
}

extension Record {
    var description: String {
        return String(format: "Wins: %d  Losses: %d", wins, losses)
    }
    
    var gamePlayed: Int {
        return wins + losses
    }
}

struct BasketballRecord: Record {
    var wins: Int
    var losses: Int
    
    func winningPercent() -> Double {
        return Double(wins) / Double (gamePlayed)
    }
}

let teamRecord = BasketballRecord(wins: 2, losses: 10)
print(teamRecord)
  • 面向协议编程
protocol Record: CustomStringConvertible {
    var wins: Int {get}
    var losses: Int {get}
    
    func winningPercent() -> Double
}

extension Record {
    var description: String {
        return String(format: "Wins: %d  Losses: %d", wins, losses)
    }
    
    var gamePlayed: Int {
        return wins + losses
    }
    
    func winningPercent() -> Double {
        return Double(wins) / Double (gamePlayed)
    }
}

protocol Tieable {
    var ties: Int{get}
}

extension Record where Self: Tieable {
    var gamePlayed: Int {
        return wins+ties+losses
    }
    
    func winningPercent() -> Double {
        return Double(wins) / Double (gamePlayed)
    }
}
    
struct BasketballRecord: Record {
    var wins: Int
    var losses: Int
}

struct FootballRecord: Record, Tieable {
    var wins: Int
    var ties: Int
    var losses: Int
}

let footballTeamRecord: FootballRecord = FootballRecord(wins: 3, ties: 2, losses: 1)
footballTeamRecord.winningPercent()  // 0.5
  • 协议聚合
func award(one: Prizable & CustomStringConvertible) {
    if one.isPrizable(){
        print("Congratulate!")
    }
}
  • 范型约束
func topOne<T: Comparable>(seq: [T]) -> T {
    assert(seq.count > 0)
    return seq.reduce(seq[0]){ max( $0 , $1 ) }
}


func topPirzableOne<T: Comparable & Prizable> (seq: [T]) -> T? {
    return seq.reduce(nil){ ( tmpTop: T? , contender: T) in
        
        guard contender.isPrizable() else{
            return tmpTop
        }
        
        guard let tmpTop = tmpTop else{
            return contender
        }
        
        return max( tmpTop , contender )
    }
}
  • 委托模式
protocol TurnBasedGame {
    var turn: Int {get set}
    
    func play()
}

protocol TurnBasedGameDelegate {
    func gameStart()
    func playerMove()
    func gameEnd()
    func gameOver() -> Bool
}

class SinglePlayerTurnBasedGame: TurnBasedGame {
    var turn: Int = 0
    var delegate: TurnBasedGameDelegate!
    
    func play() {
        delegate.gameStart()
        while !delegate.gameOver() {
            print("Round ",self.turn)
            delegate.playerMove()
            turn += 1
        }
        delegate.gameEnd()
    }
}


class RollNumberGame: SinglePlayerTurnBasedGame, TurnBasedGameDelegate {

    var score = 0
    
    override init() {
        super.init()
        delegate = self
    }
    
    func gameStart() {
        score = 0
        turn = 0
        print("Game Start")
    }
    
    func playerMove() {
        let rollNumber = Int(arc4random())%6 + 1
        score += rollNumber
        print("The score is ", score, "now.")
    }
    
    func gameEnd() {
        print("You win the game in ", turn, "round!")
    }
    
    func gameOver() -> Bool {
        return score >= 100
    }
    
}

let game:RollNumberGame = RollNumberGame()
game.play()
  • 可选的协议方法
@objc protocol TurnBasedGameDelegate {
    func gameStart()
    func playerMove()
    func gameEnd()
    
    @objc optional func turnStart()
    
    func gameOver() -> Bool
}

相关文章

  • Swift 2 学习笔记 19.面向协议的编程

    课程来自慕课网liuyubobobo老师 面向协议的编程 扩展协议和默认实现 面向协议编程 协议聚合 范型约束 委...

  • Swift 中协议的扩展的简单应用

    参考: Swift面向协议编程初探 从 Swift 的面向协议编程说开去 根据下面的结构 设计类和协议 使用:

  • swift和OC的比较

    swift ----OC比较 编程范式 Swift 可以面向协议编程、函数式编程、面向对象编程。Objective...

  • [Swift5.1] 27-面向协议编程

    面向协议编程 面向协议编程(Protocol Oriented Programming,简称POP) 是Swift...

  • Swift 中的面向协议编程

    Swift 中面向协议编程的应用,与面向对象不同的编程模式。在 Swift 这个现代化的编程语言中,感受面向协议带...

  • Swift 面向协议编程遇到的问题

    Swift 面向协议编程 背景 Swift 面向协议编程在 WWDC 2015 中提出, 业界已经有很多优秀的实践...

  • Swift面向协议编程

    Swift面向协议编程 不要用子类!Swift的核心是面向协议 Protocol Oriented Program...

  • Swift-面向协议编程(转载)

    Swift的核心 我们可以通过等式的传递性来理解swift: Swift的核心是面向协议的编程。 面向协议的编程的...

  • Swift和OC有什么区别?

    1.Swift可以面向协议编程、函数式编程、面向对象编程。 2.Swift是类型安全的,代码中使用字符串Strin...

  • Swift和OC的区别

    一.编程范式 1.Swift可以面向协议编程,函数式编程,面向对象编程; 2.OC以面向对象编程为主,当然也可以引...

网友评论

      本文标题:Swift 2 学习笔记 19.面向协议的编程

      本文链接:https://www.haomeiwen.com/subject/khjtcqtx.html