姚宁的博客

Swift分享

SwiftySwift

👉 包含了超过500个可以提高效率的Swift原生扩展

举几个🌰

  • String
    将近100个扩展 包含字符串判断、裁剪、与时间、float、double、int、bool等类型的转换、拆为字符再合并等…
  • Array
    包含排序(sort)、旋转(rotate)、拆分(divided)、提取下标(indices)、指定key分组(groupByKey)、移除相同项(duplicatesRemoved)
      //提取下标
      [0, 1, 2, 3, 4, 5].indices(where: { $0 % 2 != 0 }) -> [1, 3, 5]
      //指定key分组
      [0, 2, 5, 4, 7].groupByKey { $0%2 ? "evens" : "odds" } -> [ "evens" : [0, 2, 4], "odds" : [5, 7] ]
      //去重
      [1, 1, 2, 2, 3, 3, 3, 4, 5].duplicatesRemoved() -> [1, 2, 3, 4, 5])
    

    熟练掌握这些方法对函数式编程很有用

  • Dictionary
    是否包含(haskey) 转json(jsonData jsonString)
    运算符重载(+、-、+=、-=)
    ps.使用运算符重载 需要显式的导入SwifterSwift 不然编译器报错
  • Optional
    支持比较弱 解包否则执行(unwrapped(or:)) 非空执行(run(_:))
    这里有一个支持比较强的 实用的可选项(Optional)扩展
  • UIAlerController
      UIAlertController(title: "haha").show()
      UIAlertController(title: "哈哈", message: "我知道了").show()
    
  • UIColor
    内置了四种配色(Social、Material、CSS、FlatUI)
    alpha、hexString、random、rgbComponents
  • UIImage
    bytesSize、kilobytesSize 获取图片大小
    compressed 压缩图片
    compressedData(quality:) 压缩成二进制格式 scaled(toHeight:opaque:with:) 缩放
    withRoundedCorners(radius:) 裁剪圆角
  • Date
    基于Calendar封装了一系列简便的方法、当前的天、周、月、年,是否是今天、今周、今年、今月,是否是昨天,是否是过去的时间、是否是将来的时间等等。。。 具体可以参考源码实现
  • UIView
      screenshot  
      addSubviews(_:)  
      // 封装了简单易用的仿射变换API  
      fadeIn(duration:completion:)  
      fadeOut(duration:completion:)  
      shake(direction:duration:animationType:completion:)  
      rotate(byAngle:ofType:animated:duration:completion:)  
    
  • UIScrollView
    snapshot

Optional实用扩展

  • 判空
  • or(默认值,默认闭包,抛出异常,错误处理)
  • map(map_default, map_else 更加语义化, 替代了??)
  • 组合可选项(and, zip 定义多个可选值之间的关系)
      //可选A不为空就可选B,可选B不为空就可选C...
      OptionalA.and(OptionalB).and(OptionalC)....or(default)
      //and_then
      protocol UserDatabase {
      func current() -> User?
      func spouse(of user: User) -> User?
      func father(of user: User) -> User?
      func childrenCount(of user: User) -> Int
      }
      let database: UserDatabase = ...
      // 思考如下关系该如何表达:
      // Man -> Father -> Father -> Spouse -> children
      // 查一下这个用户的奶奶有几个孩子
      // 查他老爸,查他老爸的老爸,查他老爸的老爸的老婆,查他老爸的老爸的老婆的孩子数量
      // 使用前
      let childrenCount: Int
      if let user = database.current(), 
      let father1 = database.father(user),
      let father2 = database.father(father1),
      let spouse = database.spouse(father2),
      let children = database.childrenCount(father2) {
          childrenCount = children
      } else {
          childrenCount = 0
      }
      // 使用后
      let children = database.current().and(then: { database.father($0) })
          .and(then: { database.father($0) })
          .and(then: { database.spouse($0) })
          .and(then: { database.childrenCount($0) })
          .or(0)
      // zip
      // 优点代码量更少,代码更清晰,更优雅
      // o1 o3 都不为空执行
      o1.zip2(with: o3).and(then: { print("\($0)_\($1)") })
      // o1 o3 o4 都不为空执行then
      o1.zip3(with: o3, another: o4).and(then: { print("\($0)_\($1)_\($2)") })
    
  • on
      o1.on(some: {
                  print("o1 不为空")
              })
      o2.on(none: {
          print("o2 为空")
      })
    
  • Various(filter、expect)
      struct user {
          var name: String!
          var id: Int!
    
          func work() {
              print("\(id!) need work")
          }
      }
      let u1: user? = user(name: "tom", id: 0)
      //指定id为0的用户工作
      u1.filter({ $0.id == 0 })?.work()
      // o2是空的时候以致命错误的形式终止运行
      o2.expect("😯 咋是个空??")
    

    🚗具体使用这些扩展还要结合场景来看、某些情况下并不最适用🚗

Swift常用资源分享

👉 重点推荐(awesome-iosPromiseKitSwimatSwiftySwift)