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:

    相关文章

      网友评论

          本文标题:closure

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