美文网首页
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 详解

    @autoclosure 属于swift中的一个全新的创造, 随着swift语言的健壮,函数式编程的思想的渗透.闭...

  • swift:Closure 闭包

    @noescape @autoclosure @autoclosure(escaping)

  • swift 中的关键字@autoclosure

    对于@autoclosure苹果官方的博客中有说明@autoclosure,@autoclosure 做的事情就是...

  • Swift 关于AUTOCLOSURE 和 ??

    转正:autoclosure:可理解为自动识别的闭包http://swifter.tips/autoclosure/

  • Swift的autoclosure与escaping标签

    @autoclosure 在《函数式 Swift》第四章提到了 Swift 的 autoclosure 标签能够避...

  • Swift基础知识

    autoclosure @autoclosure 做的事情就是把一句表达式自动地封装成一个闭包。用法就是在类型签名...

  • Swift @autoclosure

    使用@autoclosure可以使得该参数结果延迟获取,在获取复杂数据结果作为参数时有优化的作用 使用@autoc...

  • Swift @autoclosure

    @autoclosure 做的事情就是把一句表达式自动地封装成一个闭包 (closure)。这样我们用的时候,就可...

  • @autoclosure 和 ??

    Apple 为了推广和介绍 Swift,破天荒地为这门语言开设了一个博客(当然我觉着是因为 Swift 坑太多需要...

  • @autoclosure 和 ??

    自动关闭关键字 @autoclosure 使用与参数类型的()-> T 的闭包 ,这个闭包的参数为空,带有参数的闭...

网友评论

      本文标题:Swfit-@ autoclosure 详解

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