2016年4月18日 星期一

swift 學習筆記 10. closure 及 @autoclosure

有時候我們可以將一段 swift 的敘述 (closure) 傳給副程式 (function), 讓它去處理, 就可以在副程式中宣告將傳進來的變數名稱型別隸屬於 closure 型別也就是  ()
   func my(ac: () -> Int)   {
         // After evaluation by using the () , following code will be executed
         switch ac() { Void -> Int in
            case 1  : print("expression is: 1")
            case 2  : print("expression is: 2")
            default : print("expression known")
         }
   }
   my( {1} )
   my( {2} )
   my( {4} )
甚至因為該 closure 位在最後一個參數, 因此呼叫時其實可以將小括號 () 省略
  my {1}
  my {2}
  my {3}
另外你也可以讓function 裏面的 closure 延後執行, 只要注意將返回值傳回正確的型別:
  my { Void -> Int {  // TYPE as defined by the closure
          print("Do something here")
          return 1   // Evaluate here, closure should return a Int value accordingly.
        }

如果說將 closure 冠上屬性 @autoclosure, 也就是讓 swift自動打包(自動將敘述加上closure{}), 之後呼叫該程序就不用再加上大括號了.
   func my(@autoclosure ac: () -> Int)   {
         switch ac() {
            case 1 : print("expression is:  1")
            case 2 : print("expression is:  2")
            default  : print("expression known")
         }
   }
   my(1)
   my(2)
   my(4)
雖說 closure 位於 function 裏最後一個參數, 但此時如果省略掉小括號 (), swift 會無法判斷該敘述而產生錯誤. @autoclosure 似乎只能運用在一些需要將運算符(operator)修改的作用上. 還不是很明瞭他的詳細運作, 需要再深入 study ...

沒有留言: