如何在 Swift 3 中使用 BFTask?
Posted
技术标签:
【中文标题】如何在 Swift 3 中使用 BFTask?【英文标题】:How do I use BFTask with Swift 3? 【发布时间】:2016-10-09 02:21:16 【问题描述】:这段代码在 Swift 2 中完美运行
override func prepare(for segue: UIStoryboardSegue?, sender: Any?)
if (segue!.identifier == "FeedDetailSeg")
let viewController:ItemDetail = segue!.destination as! ItemDetail
viewController.DetailItem = collectionItems![self.selectedRow]
if self.cognitoID == collectionItems![self.selectedRow].seller
viewController.owned = true
else
viewController.owned = false
//remove item from untapped
//appDelegate.untapped.removeAtIndex(self.selectedRow)
//collect view info
self.dataStash(collectionItems![self.selectedRow].ID, itemCondition: 2).continueWithBlock(
(task: BFTask!) -> BFTask! in
if (task.error != nil)
print(task.error!.description)
else
print("DynamoDB save succeeded")
return nil;
)
现在在 Swift 3 中,我在线上遇到错误
//collect view info
self.dataStash(collectionItems![self.selectedRow].ID, itemCondition: 2).continueWithBlock(
说: 无法转换类型 '(BFTask<_>!) -> BFTask!' 的值到预期的参数类型 '(BFTask?) -> Any?!'
这是使用 AWS 将项目保存到 DynamoDB。
【问题讨论】:
您是否更新了 Swift 3 的安装? github.com/BoltsFramework/Bolts-Swift 【参考方案1】:像这样将返回类型改为Any?
而不是BFTask?
,
//collect view info
self.dataStash(collectionItems![self.selectedRow].ID, itemCondition: 2).continueWithBlock(
(task: BFTask!) -> Any! in
if (task.error != nil)
print(task.error!.description)
else
print("DynamoDB save succeeded")
return nil;
)
谢谢:)
【讨论】:
【参考方案2】:(更新为 Swift 3.1 语法)
您的self.dataStash
任务在尖括号中指定了泛型BFTask
的类型。假设您的 self.dataStash
是以下类型:
var dataStash : BFTask<MyObject>!
那么您必须将在dataStash
任务完成时调用的代码更改为:
self.dataStash(collectionItems![self.selectedRow].ID, itemCondition: 2).continue( (task: BFTask<MyObject>!) -> Any? in
尤其是在您的链式任务中,您可以指定 BFTask
返回类型:
continue( (task: BFTask<MyObject>!) -> BFTask<MyDifferentObject>? in
注意MyObject
和MyDifferentObject
必须符合AnyObject
协议。
【讨论】:
以上是关于如何在 Swift 3 中使用 BFTask?的主要内容,如果未能解决你的问题,请参考以下文章
[BFTask isFaulted]:无法识别的选择器发送到实例错误
BFTask 在后台绘制 SpriteKit 对象正在锁定主线程
如何在 swift 3.0 中编写此代码,特别是如何在 swift3 中使用宏?