无法使用类型 (Int64, String) 的参数列表调用 setValue

Posted

技术标签:

【中文标题】无法使用类型 (Int64, String) 的参数列表调用 setValue【英文标题】:Cannot invoke setValue with an argument list of type (Int64, String) 【发布时间】:2015-09-07 11:18:43 【问题描述】:

我已经在 SO 和 google 上检查了这里的答案,我很困惑。

    func saveAvailableWord(word: GameWord) 
       let gw = NSEntityDescription.insertNewObjectForEntityForName("GameWord", inManagedObjectContext: persistence.managedObjectContext!) as! NSManagedObject
       let rId = word.rowID
       gw.setValue(rId, forKey: "rowID") //*** Error line

上面的代码是针对核心数据的,只是尝试创建一个对象。但我明白了

"不能使用类型为 '(Int64, forKey: String)' 的参数列表调用 'setValue'

在标记线上。 rowID 被定义为@NSManaged var rowID: Int64,因为它来自 SQLite ROWID 列。

如果我用一个简单的数字替换 rId 变量,错误就会消失。我错过了什么?我究竟做错了什么?

感谢您的时间和帮助。

【问题讨论】:

【参考方案1】:
func setValue(value: AnyObject?, forKey key: String)

期望一个(可选的)对象作为第一个参数。与Int 不同,固定 大小整数类型Int64Int32、...不会自动桥接到 NSNumber 对象,所以你必须显式调用

gw.setValue(NSNumber(longLong: rID), forKey: "rowID")

但是如果在托管对象子类中rowId被定义为Int64, 那么你可以简单地用

分配属性值
gw.rowID = rID

无需键值编码方法。

【讨论】:

这正是我所需要的。我尝试过其他演员阵容,但没有尝试过 NSNumber。简单地分配值是要走的路。谢谢!

以上是关于无法使用类型 (Int64, String) 的参数列表调用 setValue的主要内容,如果未能解决你的问题,请参考以下文章

Go语言string,int,int64 ,float之间类型转换方法

无法转换类型“[String : AnyObject]?”的值到预期的参数类型“[NSAttributedStringKey:Any]?”

无法使用“Int”类型的索引为“[String : String]”类型的值下标

golang的一些基础数据类型转换

go语言中int、int32、int64转string

无法将“Int”类型的值分配给“String”类型?在 (cellForRowAt) 中使用 Tableview