【问题标题】:Type AnyObject? does not conform to protocol CVarArgType?键入任何对象?不符合协议 CVarArgType?
【发布时间】:2014-12-20 20:23:57
【问题描述】:

我正在尝试动态生成谓词并在从 Xcode 的 beta 版本更新后出现编译错误。任何想法是什么问题。我尝试将 valueForKey 的结果强制转换为 CVarArgType,但没有成功。

import UIKit
import CoreData

class User: NSManagedObject {
    @NSManaged var a: String?
    @NSManaged var b: String?
}


var user = User() // This will probably crash, but good enough to reproduce compile error
var keys = ["a", "b"]

for key in keys {
    var predicate = NSPredicate(format: "%K == %@", key, user.valueForKey(key))
}

【问题讨论】:

  • 报错在哪里?另外,您至少可以为keys 提供一个仍然重现错误的虚假声明吗?此外,managedObject 的虚假声明会很棒。人们越容易测试您的代码并重现问题(尤其是在操场上),您将获得更好的答案。
  • @Bluehound %@ 不应用于谓词中的属性名称
  • @drewag 异常发生在 valueForKey 调用上。我在代码中有一条注释说键是一个字符串数组 ["property1", "property2"]
  • 你是对的。我只是看了看,认为强格式说明符不是谓词格式说明符
  • @aryaxt,我的意思是,如果你能给我们一个代码块,我们可以复制并粘贴到 Playground 中并得到错误,我们可以更有效、更快速地为你提供帮助。

标签: swift nspredicate


【解决方案1】:

问题是managedObject.valueForKey(key) 返回一个可选值。您将必须首先验证它是否返回了一个值:

if let value = managedObject.valueForKey(key) {
    var predicate = NSPredicate(format: "%K == %@", key, value )
    predicates.append(predicate)
}

另一个问题是您试图将 AnyObject 作为参数传递。您还可以将 NSObject 的可选转换添加到 if-let 中,这应该可以修复您的编译器错误:

if let value = user.valueForKey(key) as? NSObject {
    var predicate = NSPredicate(format: "%K == %@", key, value)
}

【讨论】:

  • 还是同样的问题。我也尝试过强制解包,将在几秒钟内提供示例游乐场代码
  • 仍然出现相同的编译错误。你运行的是最新版本的 Xcode 吗?在我更新到最新版本之前,我的代码一直有效
  • @aryaxt,对不起,我的操场坏了。您还需要将结果值转换为字符串。请参阅我的更新答案。
  • ... as? NSObject 也可以工作,并且不限于字符串属性。
  • 但值不一定是字符串。您可以有一个谓词来检查 NSNumber 或 NSManagedObject,例如 "address == %@", user.address
猜你喜欢
  • 1970-01-01
  • 2014-12-19
  • 1970-01-01
  • 1970-01-01
  • 2015-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多