closure

2020-06-30  本文已影响0人  VervertomJC

閉包語法表達:

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

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

    reversedNames = names.sorted(by: { (s1: String, s2: String) -> Bool in
                                      return s1 > s2 } ) 
     reversedNames = names.sorted(by:{s1, s2 in return s1 > s2} )
      reversedNames = names.sorted(by: { s1, s2 in s1 > s2 } )
      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
         }
     }
方法三:
     loadata { [unowned self] () -> () in
         print("callback")
         self.view.backgroundColor = UIColor.brown
       }
     } 

Reference:

上一篇下一篇

猜你喜欢

热点阅读