首页 文章

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

提问于
浏览
0

所以我正在转换这行代码

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) - > Bool'的值转换为预期的参数类型'(AnyObject,[String:AnyObject]?) - > Bool'

有没有人在使用块时遇到此错误?

Additional Info

SWIFT代码

apiClient.dismissFeed(feedEntryId, completion: {(responseObject: AnyObject, error: NSError) -> Void in

    })

错误

无法将'(AnyObject,NSError) - > Void'类型的值转换为预期的参数类型'AFAPIOperationCompletionBlock!'

这是完成块代码 AFAPIOperationCompletionBlock

- (void) completion:(id)responseObject error:(NSError *)error

1 回答

  • 0

    在Objective-C中,闭包的第一个参数 id evaluatedBlock 可以被任何对象指针替换,如 TidyFeed * ,这是一个已知的方法,如果你确定所评估的对象实际上属于那种类型,就可以避免额外的指针转换 .

    但是Swift不允许这样做,你必须将指针强制转换为块:

    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
    }
    

    另请注意如何将通配符模式 _ 用于未使用的 bindings 参数 .

相关问题