Swift編程思想(四) —— 基于Swift5.1的面向協(xié)議編程(二)

版本記錄

版本號(hào) 時(shí)間
V1.0 2020.02.14 星期五

前言

Swift作為一門(mén)開(kāi)發(fā)語(yǔ)言,它也有自己的特點(diǎn)和對(duì)應(yīng)的編程特點(diǎn),接下來(lái)我們就一起看一下這門(mén)語(yǔ)言。讓我們一起熟悉和學(xué)習(xí)它。感興趣的可以看下面幾篇。
1. Swift編程思想(一) —— 函數(shù)式編程簡(jiǎn)介(一)
2. Swift編程思想(二) —— 函數(shù)式編程簡(jiǎn)介(二)
3. Swift編程思想(三) —— 基于Swift5.1的面向協(xié)議編程(一)

源碼

下面就簡(jiǎn)單的看下代碼吧

protocol Bird: CustomStringConvertible {
  var name: String { get }
  var canFly: Bool { get }
}

extension CustomStringConvertible where Self: Bird {
  var description: String {
    canFly ? "I can fly" : "Guess I'll just sit here :["
  }
}

extension Bird {
  // Flyable birds can fly!
  var canFly: Bool { self is Flyable }
}

protocol Flyable {
  var airspeedVelocity: Double { get }
}

struct FlappyBird: Bird, Flyable {
  let name: String
  let flappyAmplitude: Double
  let flappyFrequency: Double

  var airspeedVelocity: Double {
    3 * flappyFrequency * flappyAmplitude
  }
}

struct Penguin: Bird {
  let name: String
}

struct SwiftBird: Bird, Flyable {
  var name: String { "Swift \(version)" }
  let version: Double
  private var speedFactor = 1000.0
  
  init(version: Double) {
    self.version = version
  }
  // Swift is FASTER with each version!
  var airspeedVelocity: Double {
    version * speedFactor
  }
}

enum UnladenSwallow: Bird, Flyable {
  case african
  case european
  case unknown
  
  var name: String {
    switch self {
    case .african:
      return "African"
    case .european:
      return "European"
    case .unknown:
      return "What do you mean? African or European?"
    }
  }
  
  var airspeedVelocity: Double {
    switch self {
    case .african:
      return 10.0
    case .european:
      return 9.9
    case .unknown:
      fatalError("You are thrown from the bridge of death!")
    }
  }
}

extension UnladenSwallow {
  var canFly: Bool {
    self != .unknown
  }
}

UnladenSwallow.unknown.canFly  // false
UnladenSwallow.african.canFly  // true
Penguin(name: "King Penguin").canFly  // false

UnladenSwallow.african

let numbers = [10, 20, 30, 40, 50, 60]
let slice = numbers[1...3]
let reversedSlice = slice.reversed()

let answer = reversedSlice.map { $0 * 10 }
print(answer)

class Motorcycle {
  init(name: String) {
    self.name = name
    speed = 200.0
  }
  
  var name: String
  var speed: Double
}

protocol Racer {
  var speed: Double { get }  // speed is the only thing racers care about
}

extension FlappyBird: Racer {
  var speed: Double {
    airspeedVelocity
  }
}

extension SwiftBird: Racer {
  var speed: Double {
    airspeedVelocity
  }
}

extension Penguin: Racer {
  var speed: Double {
    42  // full waddle speed
  }
}

extension UnladenSwallow: Racer {
  var speed: Double {
    canFly ? airspeedVelocity : 0.0
  }
}

extension Motorcycle: Racer {}

let racers: [Racer] =
  [UnladenSwallow.african,
   UnladenSwallow.european,
   UnladenSwallow.unknown,
   Penguin(name: "King Penguin"),
   SwiftBird(version: 5.1),
   FlappyBird(name: "Felipe", flappyAmplitude: 3.0, flappyFrequency: 20.0),
   Motorcycle(name: "Giacomo")]

func topSpeed<RacerType: Sequence>(of racers: RacerType) -> Double
    where RacerType.Iterator.Element == Racer {
  racers.max(by: { $0.speed < $1.speed })?.speed ?? 0.0
}

topSpeed(of: racers) // 5100

topSpeed(of: racers[1...3]) // 42

extension Sequence where Iterator.Element == Racer {
  func topSpeed() -> Double {
    self.max(by: { $0.speed < $1.speed })?.speed ?? 0.0
  }
}

racers.topSpeed()        // 5100
racers[1...3].topSpeed() // 42

protocol Score: Comparable {
  var value: Int { get }
}

struct RacingScore: Score {
  let value: Int
  
  static func <(lhs: RacingScore, rhs: RacingScore) -> Bool {
    lhs.value < rhs.value
  }
}

RacingScore(value: 150) >= RacingScore(value: 130)  // true

protocol Cheat {
  mutating func boost(_ power: Double)
}

extension SwiftBird: Cheat {
  mutating func boost(_ power: Double) {
    speedFactor += power
  }
}

var swiftBird = SwiftBird(version: 5.0)
swiftBird.boost(3.0)
swiftBird.airspeedVelocity // 5015
swiftBird.boost(3.0)
swiftBird.airspeedVelocity // 5030

后記

本篇主要講述了基于Swift5.1的面向協(xié)議編程,感興趣的給個(gè)贊或者關(guān)注~~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 版本記錄 版本號(hào)時(shí)間V1.02020.02.14 星期五 前言 Swift作為一門(mén)開(kāi)發(fā)語(yǔ)言,它也有自己的特點(diǎn)和對(duì)應(yīng)...
    刀客傳奇閱讀 1,963評(píng)論 0 6
  • 第一章.面向?qū)ο笈c面向協(xié)議編程 本書(shū)是關(guān)于面向協(xié)議編程。當(dāng)蘋(píng)果2015年的開(kāi)發(fā)者大會(huì)上發(fā)布了Swift2,他們也宣...
    醬油不愛(ài)醋閱讀 1,507評(píng)論 0 7
  • 最近有時(shí)間,挑了幾個(gè)今年WWDC中比較感興趣的Session視頻來(lái)學(xué)習(xí),今天就抽時(shí)間整理一下關(guān)于Swift 2.0...
    我是喬忘記瘋狂閱讀 6,343評(píng)論 12 54
  • 小寒 (二十四節(jié)氣之一) 概述 小寒,為農(nóng)歷二十四節(jié)氣中的第23個(gè)節(jié)氣,也是冬季的第五個(gè)節(jié)氣,標(biāo)志著季冬時(shí)節(jié)的正式...
    皇氏三墳閱讀 1,691評(píng)論 0 1
  • 感恩日記 今天翻手機(jī)相冊(cè),看到了這幾張照片,這是在母親節(jié)的時(shí)候我和三妹,還有二妹一家老小,在新世紀(jì)酒店給老媽...
    美玲_閱讀 297評(píng)論 0 0

友情鏈接更多精彩內(nèi)容