【问题标题】:How can I rewrite in Swift this block?如何在 Swift 中重写这个块?
【发布时间】:2015-08-06 10:11:32
【问题描述】:

我需要重写一个 Objective-C 块但我不能

这是有问题的块:

[service executeQuery:query completionHandler:^(GTLServiceTicket *ticket, GTLDriveFileList* files, NSError *error) {
        }];

在 Swift 中,我尝试过:

service.executeQuery(query, completionHandler: {(ticket:GTLServiceTicket!,files:GTLDriveFileList!,error:NSError!) -> Void in
        })

但编译器不同意这一点。

我试过了:

service.executeQuery(query, completionHandler: {(ticket:GTLServiceTicket?,files:GTLDriveFileList?,error:NSError?) -> () in
})

但同样的问题。

当我 cmd+点击类时,我发现:

// Clients should create a standard query with any of the class methods in
// GTLQueryDrive.h. The query can the be sent with GTLService's execute methods,
//
//   - (GTLServiceTicket *)executeQuery:(GTLQuery *)query
//                    completionHandler:(void (^)(GTLServiceTicket *ticket,
//                                                id object, NSError *error))handler;

有人知道怎么做吗?

谢谢

【问题讨论】:

  • service.executeQuery(query) { (ticket, object, error) -> () in /* ... your task comes here ... */ };,也许……?
  • files:GTLDriveFileList 更改为files:AnyObject!
  • 它可以工作,但我需要文件具有 GTLQueryDriveFileList 类型,因为在我需要使用 files.items.count 之后,如果文件没有类型,则不存在。

标签: ios objective-c swift closures objective-c-blocks


【解决方案1】:

完成处理程序的第二个参数是一个 id 对象(obj c),所以在 swift 中它会变成AnyObject

迅速

service.executeQuery(query, completionHandler: {(ticket:GTLServiceTicket!, object: AnyObject!, error: NSError!)->Void in

})

swift 3.0 --

因为 objc 代码中的 id 参数在 Swift 3.0 中具有 Any 类型,因此 --

service.executeQuery(query, completionHandler: {(ticket:GTLServiceTicket?, object: Any?, error: Error?)->Void in 

})

【讨论】:

  • 这个答案没有足够的信息。请为您的代码 sn-p 添加一些上下文和/或解释。
  • 希望对您有所帮助,问候,阿比
猜你喜欢
  • 1970-01-01
  • 2016-07-26
  • 1970-01-01
  • 1970-01-01
  • 2011-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多