Swift 项目使用 CoreData 可能会碰到的 32 位系统问题

原创 2015年11月19日 10:46:40

最近在项目中偶然发现了一个问题,那就是 Swift 的 CoreData 在 32 位系统下与 64 位系统下表现不一致的问题。

简单的说:如果你的 CoreData 模型有一个声明为 Boolean 的 Attribute,并且在代码中使用 NSNumber 来包装(而不是 Bool)的话,很可能会遇到这个问题。

这个问题简述之则是这样:

假如有一个 Post 的 CoreData 类型,它有一个 isPublished 的属性,CoreData 使用 NSNumber 来包装这个属性。我对其进行赋值:

post.isPublished = true

没错,虽然 isPublished 在代码中是 NSNumber 类型,但是得益于 Swift 的「Literal Convertibles」机制,我们可以直接给 NSNumber 赋值 true,然后它就会以 true 存储。

问题就在这里出现了。如果是在 32 位的系统下,我用

if post.isPublished == true {

}

进行条件判断,那么很遗憾不会走进这个条件分支里,在 64 位系统下是正常的。

如果改成:

if post.isPublished == 1 {

}

那么无论在 32 位和 64 位系统下都是正常的。

发现这个问题的,开始想解决方法,假设这真的是 Swift 在 32 位系统下的 Bug,难道我要把这些比较都改成 1 或 0?

后来我找到一个方法,那就是创建 CoreData 的 NSManagedObject 的 class 的时候,勾上那个 Option:Use scalar properties for primitive data types,这样 isPublished 就不是用 NSNumber 这种包装型的,而是直接用 Bool 类型了。经测试,无论在 32 位系统下还是 64 位系统下,条件判断都工作正常了。算是优雅地绕开了这个可能是 Swift 的 Bug。

Swift Scalar Properties

后来我又尝试了下不用 CoreData,直接用 NSNumber = false 的形式来进行判断,发现没有这个问题。看来这个问题可能只存在 CoreData 上。

既然写起了 Swift + CoreData 这个组合,免不了需要吐槽一个 Apple 做的还不好的地方:

以往 Objective-C 项目时,CoreData 对象的一个属性是不是空值,我们直接判断是不是 nil 就可以了,但是在 Swift 项目下,一切变得麻烦了,Xcode 默认给我们产生的 CoreData 对象的属性,全都不是optional 的,也就是说,如果一个属性可能是空值,我们还要手动给这个加上一个「?」,它才会如我们所愿可以用 Optional 的方式。这点实在是很不方便。

具体可以看一个帖子:Swift + CoreData: Cannot Automatically Set Optional Attribute On Generated NSManagedObject Subclass

OK,希望接下去不要碰到太多类似的坑。

swift 之CoreData使用

1、CoreData使用 创建一个swift语言项目  ,主要功能添加联系人,显示联系人列表,删除联系人。 1、创建数据模型 data Model ,此模型用来构建数据库表,映射到实体模型...
  • luosai19910103
  • luosai19910103
  • 2016年04月07日 01:13
  • 505

swift中使用CoreData实现增删查改

1.建立CoreData项目创建项目时勾选 User Core Data 2.创建实体(Entity)创建项目后,可以看到目录中有一个.xcdatamodeld文件。...
  • WorthyZhang
  • WorthyZhang
  • 2015年06月23日 11:14
  • 3600

swift:CoreData简单入门(增加、查询、修改、删除)(详细讲解)

CoreData 是 一个可以用来管理 对象生命周期、对象层级、数据持久化存储 的苹果官方框架。 下面来看看如何用swift语言来使用CoreData呢? 1 打开Xcode,选择Xcode proj...
  • qj918
  • qj918
  • 2016年03月05日 02:10
  • 5480

Swift教程_CoreData实例(四)_构建控制层(查询、更新数据)

查询数据 我们自定义一个列表控制器PKOBookDetailTableViewController,并应用到storyboard的明细显示view中,用来显示所选中的book的明细。通过PKOBoo...
  • ooppookid
  • ooppookid
  • 2014年11月07日 07:56
  • 2895

Swift 3.0 使用Core Data

自iOS10 和swift3.0 之后,苹果的访问CoreData的方法发生了很大改变,简洁了许多,下面的内容是从0开始建立一个entity,并实现其存储和读取的功能。...
  • tsyccnh
  • tsyccnh
  • 2016年10月02日 10:44
  • 5071

swift3.0 coredata 的使用

swift3.0操作coredata,增删改查
  • scx_yatoy
  • scx_yatoy
  • 2016年09月18日 14:47
  • 4323

Swift CoreData增删改查

之前写过CoreData,现在都忘记了,不多说,直接上代码和截图,增删改查的功能都有 import UIKit import CoreData class ViewController: UIVi...
  • Arodung
  • Arodung
  • 2017年10月30日 18:05
  • 153

Swift Core Data 图片存储与读取Demo

实体的模型定义: 实体的class定义:@objc(ImageEntity) class ImageEntity: NSManagedObject { @NSManaged var imag...
  • zhangao0086
  • zhangao0086
  • 2015年03月20日 23:08
  • 9204

Swift 3.0 使用CoreData兼容iOS9和iOS10的CoreData实例

写在前面,由于苹果公司对CoreData的改动,使得在Xcode8.0和ios10.0以上环境下使用新语法使用CoreData不兼容ios9以下系统,本实例主要简单介绍Swift3.0中CoreDat...
  • pkx0128
  • pkx0128
  • 2016年12月06日 11:29
  • 1182

iOS Swift教程 Core Data (三)Core Data栈 下

接下来,我们创建自己的stack object。 创建一个名为CoreDataStack的swift加入到工程中。 定义成员变量: import CoreData class CoreDataSta...
  • yamingwu
  • yamingwu
  • 2014年12月31日 17:56
  • 2051
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Swift 项目使用 CoreData 可能会碰到的 32 位系统问题
举报原因:
原因补充:

(最多只允许输入30个字)