无法将类型的值转换为预期的参数类型

时间:2016-04-07 07:09:35

标签: objective-c xcode swift nspredicate

所以我正在转换这行代码

 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 

1 个答案:

答案 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 } 表示未使用的模式 _参数。