Swift - 面向协议

2020-12-26  本文已影响0人  lieon

Swift面向协议

利用协议实现前缀效果

  struct Lee<Base> {
      let base: Base
      
      init(_ base: Base) {
          self.base = base
      }
  }

  protocol LeeCompatible { }

  extension LeeCompatible {
      var lee: Lee<Self> {
          get { Lee(self) }
          set {}
      }
      static var lee: Lee<Self>.Type {
          get { Lee<Self>.self }
          set { }
      }
  }

  extension String: LeeCompatible { }

  extension Lee where Base == String {
      var numberCount: Int {
          var count = 0
          let strs = ("0"..."9")
          for c in base where strs.contains(String(c)) {
              count += 1
          }
          return count
      }
  }

  extension Lee where Base: ExpressibleByStringLiteral {
      var numberCount: Int {
          var count = 0
          let strs = ("0"..."9")
          for c in (base as! String) where strs.contains(String(c)) {
              count += 1
          }
          return count
      }
  }

  func testLee() {
     let count = "asdf123".lee.numberCount
      print(count)
      LeePerson.lee.test()
      LeeStudent.lee.test()
      
      let p = LeePerson()
      p.lee.run()
      
      let s = LeeStudent()
      s.lee.run()
  }

  class LeePerson { }
  class LeeStudent: LeePerson {}
  extension LeePerson: LeeCompatible { }

  extension Lee where Base: LeePerson {
      func run() {}
      static func test() {}
  }

利用协议实现类型判断

     protocol ArrayType { }
     extension Array: ArrayType { }
     extension NSArray: ArrayType { }

     func isArrayType(_ type: Any.Type) -> Bool {
         return type is ArrayType.Type
     }
     isArrayType([Int].self)
     isArrayType([Any].self)
     isArrayType(NSArray.self)
     isArrayType(NSMutableArray.self)
上一篇 下一篇

猜你喜欢

热点阅读