美文网首页
Swfit-@ autoclosure 详解

Swfit-@ autoclosure 详解

作者: 雨三楼 | 来源:发表于2016-05-10 00:20 被阅读70次

    @autoclosure 属于swift中的一个全新的创造, 随着swift语言的健壮,函数式编程的思想的渗透.闭包的应用也愈发的重要了起来.

    而在使用闭包的过程中,我们常常会碰到这种书写格式:

    
    func logState(predict : ()->Bool){
      if predict() {
         print("can nslog")
      }else{
         print("can`t nslog")
      }
    }
    /// 调用
    logState({1 > 0})
    
    

    这样小括号里镶嵌大括号是十分不优雅的

    索性,,我们有了@ autoclosure ,

    于是代码变成了:

    
    func logState(@autoclosure predict : ()->Bool){
      if predict() {
        print("can nslog")
      }else{
        print("can`t nslog")
      }
    }
    /// 调用
    logState (1 > 2)
    
    

    这样调用起来就舒服多了.

    值得一提的是@ autoclosure的用法和注意事项,,首先遗憾的是@ autoclosure只支持无参的写法 即:

    ()->T
    

    这种格式...

    其次最重要的是@ autoclosure引出了swift另一个强大的设计<延迟计算>
    举个栗子🌰:
    swift 中判空的操作符?? 的内部实现

    /// ??
    public func ??<T>(optional: T?, @autoclosure defaultValue: () throws -> T) rethrows -> T
    
    // 简化版
    func ??<T>(optional:T?,@autoclosure defaultValue: () ->T) -> T{
      switch optional{
       case .Some(let value):
             return value
       case .None:
             return defaultValue()
        }
     }
    

    "在swift中optional(可选类型)是一个枚举 Some / None"
    实现方法很简单,但是这里有一个问题:
    '为什么defaultValue'是一个闭包而非直接传'T'呢? 这样做有什么好处呢?
    试想遇到这种情况:
    show me code---

    
    func getResult() -> Int{
       // 耗时操作
          sleep(100)
    }
    var optional : Int?
    let result = optional ?? self.getResult()
    

    在这种情况下,如果 ?? defaultValue接受的是 T 类型不管switch 方法有没有运行到.None的branch, T 都需要提供一个值来提供这个函数来使用,
    这就造成了资源的不合理消耗,而使用闭包则不会发生这种情况,,,闭包只有在调用它的时候内部的断码段才会执行,,这就里利用了闭包的特性来巧妙的比较了资源的浪费.

    下一章:
    typealias

    相关文章

      网友评论

          本文标题:Swfit-@ autoclosure 详解

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