我在Objective C中使用块编写了以下函数,并且试图将其转换为swift,但是我将头撞在墙上,无法对其进行排序。
这是Objective C中的代码
typedef void (^ResponseBlock) (BOOL succeeded, NSArray* data);
- (void)findAllMediaFromDate:(NSDate*)createdAtDate block:(ResponseBlock)block
{
NSMutableArray *results = [NSMutableArray array];
PFQuery *query = [PFQuery queryWithClassName:PARSE_MODEL_ACTIVITIES];
[query orderByDescending:@"createdAt"];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
if (!error) {
for (ActivityObject *object in objects) {
if ([object.media.type isEqualToString: @"video"] || [object.media.type isEqualToString: @"photo"]) {
[results addObject:object];
}
}
block(YES, results);
}
else {
}
}];
}
现在这就是我在SWIFT中拥有的东西。这是一个不同的函数体,但是我尝试的语法是相同的...
func userQuery (){ //This needs to return an array as ABOVE
var results = [UserModel]()
println("NM: userQuery")
var query = UserModel.query()
query.whereKey("objectId", equalTo:"7N0IWUffOZ")
query.findObjectsInBackgroundWithBlock { (objects:[AnyObject]!, error:NSError!) -> Void in
if (objects != nil) {
NSLog("yea")
for object in objects{
results.append(object as UserModel)
//Need to return the array to the userQuery function
}
} else {
NSLog("%@", error)
}
}
}
```
您可以像这样添加闭包参数:
func userQuery(completionHandler: (succeeded: Bool, array: [UserModel]?) -> ()) {
// do your other stuff here
if objects != nil {
// build results
completionHandler(succeeded: true, array: results)
} else {
// return failure
completionHandler(succeeded: false, array: nil)
}
}
显然,将您的array
参数更改为所需的任何名称(重命名,更改类型,更改任何内容),但是基本思想是拥有可选的数组返回类型。
您可以使用结尾闭包语法来调用它,如下所示:
userQuery() {
success, results in
if success {
// use results here
} else {
// handle error here
}
}
顺便说一句,如果您喜欢Objective-Ctypedef
模式,则Swift中的等效项是typealias
:
typealias ResponseClosure = (succeeded: Bool, array: [UserModel]?) -> ()
func userQuery(completionHandler: ResponseClosure) {
// the same as above
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句