美文网首页iOS 优秀实践swift
Swift编程思想(四) —— 基于Swift5.1的面向协议编

Swift编程思想(四) —— 基于Swift5.1的面向协议编

作者: 刀客传奇 | 来源:发表于2020-02-14 11:49 被阅读0次

    版本记录

    版本号 时间
    V1.0 2020.02.14 星期五

    前言

    Swift作为一门开发语言,它也有自己的特点和对应的编程特点,接下来我们就一起看一下这门语言。让我们一起熟悉和学习它。感兴趣的可以看下面几篇。
    1. Swift编程思想(一) —— 函数式编程简介(一)
    2. Swift编程思想(二) —— 函数式编程简介(二)
    3. Swift编程思想(三) —— 基于Swift5.1的面向协议编程(一)

    源码

    下面就简单的看下代码吧

    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的面向协议编程,感兴趣的给个赞或者关注~~~

    相关文章

      网友评论

        本文标题:Swift编程思想(四) —— 基于Swift5.1的面向协议编

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