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,请添加其他代码以在IntInt32 之间进行转换。

【讨论】:

以上是关于CoreData Int32 标量问题的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:只有整数、切片、省略号、tf.newaxis 和标量 tf.int32/tf.int64 张量是有效的索引

NSPredicate 未在 CoreData 中返回 Int32

ios coredata 会在新版本中更改实体属性导致崩溃

CoreData(IOS)多列的唯一约束?

认识CoreData—初识CoreData

数据导入CoreData期间如何显示progressBar?