将 Int 保存到核心数据中的正确方法?

Posted

技术标签:

【中文标题】将 Int 保存到核心数据中的正确方法?【英文标题】:Correct method to save an Int into core data? 【发布时间】:2016-11-23 23:43:48 【问题描述】:

我有一个具有 Int16 属性的实体。

我想保存var userRepsCount = Int(),这是由以下步进方法设置的:

@IBAction func userRepsStepper(_ sender: UIStepper) 
    userExerciseRepsCounter.text = Int(sender.value).description
    self.userRepsCount = Int(sender.value)

我想将它添加到属性中并使用userExercise.reps = userRepsCount 来执行此操作,但是我收到错误

无法将类型“Int”的值分配给类型“Int16”

我的印象是 Int16 可以毫无问题地存储这样的 int?我在这里想念什么?

【问题讨论】:

您是否尝试将其强制包装为 Int16(valueHere)? swift 建议 userExercise.reps = Int16(userRepsCount) 但是我还没有看到其他人的代码这样做来保存 Int 并想知道是否有正确的方法来存储它 如果它被保存为 Int16,你将不得不像 XCode 建议的那样包装它。然后,每当你需要拉它时,你都需要用 Int(stuff) 包裹它,这样你就可以正常使用它了。很可能 Apple 已将存储值从 Int 更改为 Int16,并且您的教程就在该更新之前。 Swift 更新改变了很多东西。 啊,如果这就是答案,我发现奇怪的是,当我只看到代码中使用的 Int 为“Int”时,有各种 Int 样式,包装似乎过于复杂 包装很冗长,但不幸的是,swift无法自动转换值!有很多类型的 Int,看...codingexplorer.com/integers-and-numeric-literals-in-swift,您实际上只是在告诉 Swift,它将介于 -32,768 和 32,767 之间 【参考方案1】:

尝试用Int64(userRepsCount)包裹它,然后当你拉它时,在你处理它之前用Int(value)包裹它

【讨论】:

这不起作用 - 请参阅下面的@SkipMia2w3 的答案。而是将其作为 Int32 存储在数据库中。 @KarolyNyisztor 我知道,正如您在下面看到的,我们讨论了它。我只是忘了更新我的答案,它现在已经更新了。 这也不起作用,因为 DB 中的属性是 Int16 类型。 OP 应将实体类型更新为 Int32 以解决问题。 考虑到 Apple 已停止在 ios 11 中支持 32 位设备,我更倾向于 Int64()。根据这个answer,您愿意进一步澄清为什么 Int64() 不能在 iOS 核心数据中工作吗? 我不是这么说的。最初的问题是 - 引用:“我有一个具有 Int16 属性的实体。”您不能在没有副作用的情况下将 Int32 或 Int64 值挤入 Int16 中。顺便说一句,Apple 停止支持 32 位设备的事实与这场辩论无关。这并不是说您不能或不应该再使用 Int16 或 Int32。【参考方案2】:

您不能将整数从 32 位向下转换为低 16 位,而不会有无效值的风险。你只能上去保值。 (IE 从 16 到 32 或 64)。如果您绝对需要,您可以使用Int16(value) 进行投射。

我建议在您的 CoreData 中使用 Integer 32 而不是 int16。对于您可能正在做的事情,不会在性能/存储方面产生明显/明显的差异。

【讨论】:

核心数据中没有直接的“Int”值选项吗? kist int16 int32 和 int64 ? 使用 Int64。你没有理由不这样做。 我会说最好使用Int32或Int64,这是你的选择,唯一的区别是Int64可以容纳更高的数字 @infernouk 你说得对,我很抱歉。固定在答案中。罗布·梅奥夫是对的。整数 64 也是一个可行的选择。 Int(value) 包裹会得到Int32 类型。

以上是关于将 Int 保存到核心数据中的正确方法?的主要内容,如果未能解决你的问题,请参考以下文章

将包含 &#38 的 XML 值节点保存到数据库中的正确方法是啥?

使用表格视图编辑核心数据中单个属性的正确方法

在核心数据中保存一个整数

将 form_list 表单实例保存到数据库的正确方法?

将日期保存到核心数据

我是不是正确地将对象添加到核心数据?