CoreData Int32 标量问题
Posted
技术标签:
【中文标题】CoreData Int32 标量问题【英文标题】:CoreData Int32 Scalar Issue 【发布时间】:2021-09-12 20:47:32 【问题描述】:在这一点上,我对在 CoreData 工作还很陌生。 我正在尝试为角色添加一个级别。我有角色实体,以及一个附加的级别属性。对于关卡,我将其设置为输入整数 32 并使用标量类型。下图是我设置关卡的方式: 在我的 Character 核心数据文件中,我的值设置如下:
@objc(Character)
class Character: WHNSManagedObject
@NSManaged var level: Int
当我运行应用程序并访问级别值时,我在控制台输出中收到 [error] 警告: [18498:840353] [错误] 警告:属性“级别”是类“字符”上的 64 位标量类型,与其实体属性的 32 位标量类型不匹配。不建议对数据库中的 32 位进行隐式强制。
所以我的问题是我在这里做错了什么?我很困惑为什么在我制作的核心数据文件中使用 Int 时 Int32 无法扩展到 Int64。 我正在尝试将类型缩小,以免占用不必要的空间。而且我还希望能够将值定义为 Int,因此我不必在每次访问变量时都进行类型转换。 提前感谢您提供的任何帮助、提示或建议!
【问题讨论】:
【参考方案1】:您需要将@Managed
属性定义为与实体属性相同的类型。您可以使用Int
将其包装在另一个属性中
public var levelValue: Int
get
Int(level)
set
Int16(exactly: newValue) ?? 0
如果您想避免从课堂外直接访问 level
,您甚至可以将其设为私有。
【讨论】:
【参考方案2】:Core Data 中的数值类型需要使用相同类型的属性。类型必须准确;您不能在模型编辑器中使用一种大小的整数,而在代码中使用不同大小的整数。
由于模型编辑器中的属性是“Integer 32”,因此 Swift 属性必须是 Int32
。您使用的是 64 位的 Int
。 Swift 不会在它们之间自动转换。您需要将level
设为Int32
。如果您在代码中需要Int
,请添加其他代码以在Int
和Int32
之间进行转换。
【讨论】:
以上是关于CoreData Int32 标量问题的主要内容,如果未能解决你的问题,请参考以下文章
TypeError:只有整数、切片、省略号、tf.newaxis 和标量 tf.int32/tf.int64 张量是有效的索引