所以我正在转换这行代码
NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(TidyFeed * _Nonnull item, NSDictionary<NSString *,id> * _Nullable bindings) {
return ![item.feedEntryId isEqualToString:feedEntryId];
}];
快速编码
var predicate = NSPredicate { (item: TidyFeed, bindings: NSDictionary) in
return !(item.feedEntryId == feedEntryId)
}
但我收到此错误
无法转换类型的值'(TidyFeed,NSDictionary) - &gt; Bool'到期望参数类型'(AnyObject,[String:AnyObject]?) - &gt;布尔“
有人在使用块时遇到此错误吗?
其他信息
Swift代码
apiClient.dismissFeed(feedEntryId, completion: {(responseObject: AnyObject, error: NSError) -> Void in
})
错误
无法转换类型的值'(AnyObject,NSError) - &gt; Void'到预期的参数类型'AFAPIOperationCompletionBlock!'
这是 AFAPIOperationCompletionBlock
的完成版代码- (void) completion:(id)responseObject error:(NSError *)error
答案 0 :(得分:0)
在Objective-C中,闭包的第一个参数CData
可以被任何对象指针替换,例如id evaluatedBlock
是一种已知的方法,如果你确定所评估的对象实际上属于那种类型,就可以避免额外的指针转换。
然而Swift不允许这样做,你必须施放指针 在街区内:
TidyFeed *
如果使用不是的对象调用块,则会崩溃
类型为let predicate = NSPredicate { (item: AnyObject, _) -> Bool in
return (item as! TidyFeed).feedEntryId != feedEntryId
}
。
TidyFeed
带有可选的演员。这可以更紧凑地写成:
let predicate = NSPredicate { (item: AnyObject, _) -> Bool in
if let feed = item as? TidyFeed {
return feed.feedEntryId != feedEntryId
} else {
return false
}
}
另请注意如何使用通配符模式let predicate = NSPredicate { (item: AnyObject, _) -> Bool in
return (item as? TidyFeed)?.feedEntryId != feedEntryId
}
表示未使用的模式
_
参数。