函数调用后如何读取代码块?

时间:2014-09-24 22:04:20

标签: swift

我是swift的新手,我需要帮助才能阅读以下代码。

  1. 函数调用“self.table.update(completedItem)”{...}
  2. 后代码块的含义是什么
  3. 作为代码块第一行的(result,error)含义是什么:

    self.table!.update(completedItem){                 (结果,错误)in  // ...来代码  }

  4. 完整代码:

    override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath)
        {
            let record = self.records[indexPath.row]
            let completedItem = record.mutableCopy() as NSMutableDictionary
            completedItem["complete"] = true
    
            UIApplication.sharedApplication().networkActivityIndicatorVisible = true
            self.table!.update(completedItem) {
                (result, error) in
    
                UIApplication.sharedApplication().networkActivityIndicatorVisible = false
                if error != nil {
                    println("Error: " + error.description)
                    return
                }
    
                self.records.removeAtIndex(indexPath.row)
                self.tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic)
            }
        }
    

1 个答案:

答案 0 :(得分:3)

  1. 代码块称为“尾随闭包”。当函数或方法将闭包作为最后一个参数时,可以在函数/方法调用的右括号之后放置闭包。尾随闭包允许您编写看起来更像内置控件结构的函数,并允许您避免在括号内嵌套括号。
  2. 例如,UIView定义了具有此签名的类方法:

    class func animateWithDuration(duration: NSTimeInterval, animations: () -> Void)
    

    所以你可以这样称呼它:

    UIView.animateWithDuration(0.2, animations: {
        self.view.alpha = 0
    })
    

    或者您可以使用尾随闭包调用它,如下所示:

    UIView.animateWithDuration(0.2) {
        self.view.alpha = 0
    }
    

    请注意,使用尾随闭包,您完全省略了最后一个参数的关键字(animations:)。

    您只能对函数的最后一个参数使用尾随闭包。例如,如果使用UIView.animateWithDuration(animations:completion:),则必须将animations:块放在括号内,但可以使用completion:块的尾随闭包。

    1. (result, error)部分声明了块参数的名称。我推断update方法的签名是这样的:

      func update(completedItem: NSMutableDictionary,
          completion: (NSData!, NSError!) -> Void)
      
    2. 所以它用两个参数调用完成块。要访问这些参数,该块会为其指定名称resulterror。您不必指定参数类型,因为编译器可以根据update的声明推断出类型。

      请注意,您实际上可以省略参数名称并使用简写名称$0$1

      self.table!.update(completedItem) {
          UIApplication.sharedApplication().networkActivityIndicatorVisible = false
          if $1 != nil {
              println("Error: " + $1.description)
              return
          }
      
          self.records.removeAtIndex(indexPath.row)
          self.tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic)
      }
      

      您可以阅读“Closures” in The Swift Programming Language了解有关闭包的更多信息。