【问题标题】:Cannot convert value of type to expected argument type无法将类型的值转换为预期的参数类型
【发布时间】:2016-07-27 21:58:31
【问题描述】:

所以我正在转换这行代码

 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'

有人在使用积木时遇到过这个错误吗?

其他信息

Swift 代码

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

    })

错误

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

这是AFAPIOperationCompletionBlock

的完成块代码
- (void) completion:(id)responseObject error:(NSError *)error 

【问题讨论】:

    标签: objective-c xcode swift nspredicate


    【解决方案1】:

    在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参数。

    【讨论】:

      猜你喜欢
      • 2016-07-02
      • 2016-03-21
      • 1970-01-01
      • 2020-03-01
      • 2016-08-01
      • 2017-02-07
      • 1970-01-01
      • 2016-06-03
      • 1970-01-01
      相关资源
      最近更新 更多