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,希望接下去不要碰到太多类似的坑。

版权声明:

相关文章推荐

AndroidStudio低版本(1.5)升级到高版本(2.1)之后你可能会遇到的其中一个项目构建问题

gradle构建失败的log日志如下: Gradle sync failed: Could not load wrapper properties from 'E:\studio\My\MyUti...

Android 调用系统相机拍照并且显示在相册中,以及中间可能会遇到的一些问题的解决

主要思路是在使用照相机拍照,然后为拍得的照片在SD卡新开一个储存照片的文件 代码:因为要调用照相机和SD卡所以需要添加以下权限: 在manifests中添加 android:name="android...
  • T3
  • T3
  • 2017-04-14 15:06
  • 366

Android 调用系统功能实现图片选择器,你可能会遇到的问题汇总

本文标签: Android Android开发技巧 Android图片选择器 setImageURI 图片选择器在手机应用中屡见不鲜,设置头像、聊天传图等常见类似场景都需要使用。为了保...

Android 调用系统功能实现图片选择器,你可能会遇到的问题汇总

图片选择器在手机应用中屡见不鲜,设置头像、聊天传图等常见类似场景都需要使用。为了保持不同设备上体验的一致性和较好的兼容性,比较稳妥的做法是在应用内自实现相机拍照、相册选图和图片裁剪功能。但是,这个实现...

JSP中可能会碰到的问题解答

1、如何混合使用Jsp和SSI #include? 在JSP中可以使用如下方式包含纯HTML: 但是如果data.inc中包含JSP CODE ,我们可以使用: %@include ...

bootloader开发阶段总结以及可能会碰到的问题

到今天,vivi源代码基本分析完毕。对bootloader有了更深层的认识。在此期间,仔细阅读了毛德操、胡希明先生编著的《嵌入式系统--采用公开源代码和StrongARM/XScale处理器》第七章:...

使用Google Map API可能会遇到的问题汇总

今天在将 http://www.curious-creature.org/2011/02/22/source-code-for-android-3-0-animation-demo/ 这个Demo想在...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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