closure

作者: VervertomJC | 来源:发表于2020-06-30 16:03 被阅读0次

閉包語法表達:

 //閉包表達式
{ (parameters) -> return type in
   statements
}

從上下文推斷
當將閉包作為內聯閉包表達式傳遞給函數或方法時,總是可以推斷出參數類型和返回類型。因此,當閉包用作函數或方法參數時,無需編寫其完整的形式

    reversedNames = names.sorted(by: { (s1: String, s2: String) -> Bool in
                                      return s1 > s2 } ) 
  • 作為參數時,省略 閉包參數括號()、箭頭->和返回值 return type
     reversedNames = names.sorted(by:{s1, s2 in return s1 > s2} )
  • 單個表達式 閉包 隱式返回 (隱藏return)
      reversedNames = names.sorted(by: { s1, s2 in s1 > s2 } )
  • 速記參數名稱
    swift 自動為內聯閉包提供速記名稱,在閉包表達式中使用名稱$0, $1參數名稱,可以省略in
      reversedNames = names.sorted(by: { $0 > $1 } )
  • 運算符方法
      reversedNames = names.sorted(by: > )
  • 尾隨閉包
      func someFunctionThatTakesAClosure(closure: ( ) -> Void) {
       }

尾隨閉包 寫在括號之外

      reversedNames = names.sorted( ) { $0 > $1 }

省略()

       reversedNames = names.ssorted { $0 > $1 }
一般形式
//一般形式
//有参有反
let testOne: (String, String) -> String = {(str1, str2) in return str1 + str2}
print(testOne("one", "two"))
//无参有反  可以直接省略 "in"
let testTwo: () -> String = {return "test闭包"}
//无参无反
let testThree: () -> Void = {print("test闭包")}
別名
//可以用"typealias"先声明一个闭包类型
typealias testBlock = (String) -> Void
let aaa: testBlock = {str in
    print(str)
}

closure中避免循環引用

方法一:
      weak var weakSelf = self
      loadata {
          print("callback")
          weakSelf!.view.backgroundColor = UIColor.brown
          }
      }
方法二:
     loadata { [weak self] () -> () in
         print("callback")
         // 在swift開發中,能不寫self就不寫self,但是在閉包中必須寫上self
         self!.view.backgroundColor = UIColor.brown
         }
     }
方法三:
  • 使用關鍵字unowned
  • 從行為上unowned 更像OC中的unsafe_unretained
  • unowned 表示:即使他原來引用的對象被釋放了,仍會保持對被已經釋放了的對象的一個 "無效的" 引用,牠不能是 Optional 值,也不會被指向 nil
     loadata { [unowned self] () -> () in
         print("callback")
         self.view.backgroundColor = UIColor.brown
       }
     } 

Reference:

相关文章

  • scala函数和闭包

    Function and closure

  • Closure。

    梦到他实属平常,但是梦到他流泪却是第一次。他在我对面的椅子上坐下来,明亮有神的双目流出两行泪来,一些无奈一些悲伤,...

  • Closure

    JS当中的一段实现“加法器”的代码。 显然,fiveAdder是用来每次加5的加法器,而tenAdder是用来每次...

  • Closure

    概念 直接来看两个函数的对比 执行 count1()调用第一个函数,很简单。我们会得到 arr1 = [1, 4,...

  • Closure

    写作苦旅,乐在其中 ——写于拜读《On Writing Well》全书后 参加读书会的第一个月,今天终于在大家的陪...

  • Closure

    闭包回调在于从A跳转到B时,将对A赋值的函数对象传给B,在需要赋值的时候,B调用该函数对象即可。 E.G. //...

  • Closure

    我们可用swift的闭包来定义变量的值。 先来一个简单的例子大家先感受感受。 定义一个字符串的变量的方法: 直接赋...

  • Closure

    基本函数 函数签名是不包含参数名 函数式作为一等公民,可以当做变量,返回值,参数,这提升了到函数编程的思想 Clo...

  • closure

    閉包語法表達: 從上下文推斷當將閉包作為內聯閉包表達式傳遞給函數或方法時,總是可以推斷出參數類型和返回類型。因此,...

  • Closure

    1. 概念 闭包是指拥有多个变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分...

网友评论

      本文标题:closure

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