
Swift
使用 Swift 和 CoreData 进行开发时,有时候会遇到一些奇怪的问题。其中之一是在 NSManagedObject 的子类上无法设置 Bool 类型属性的问题。在这篇文章中,我们将探讨这个问题,并提供一个解决方案。
在使用 CoreData 进行数据持久化时,我们通常会创建 NSManagedObject 的子类来表示数据模型。这样做可以使代码更加清晰和易于管理。然而,有时候在子类上设置 Bool 类型的属性时,会出现问题。让我们来看一个简单的例子。假设我们有一个名为 Person 的实体,其中有一个名为 isEmployed 的属性,它是一个 Bool 类型。我们可以创建一个名为 Person 的 NSManagedObject 子类,然后在其中添加一个名为 isEmployed 的属性。Swiftimport CoreDataclass Person: NSManagedObject { @NSManaged var isEmployed: Bool}一切看起来都很正常,但是当我们尝试在子类中设置 isEmployed 属性时,却发现无法实现。下面是一个尝试设置 isEmployed 属性的例子:Swiftlet person = Person()person.isEmployed = true然而,当我们尝试编译代码时,会遇到一个编译错误,提示我们无法给 Bool 类型的属性赋值。这是一个奇怪的问题,尤其是考虑到其他数据类型,如 String 或 Int,可以正常设置。那么,为什么在 NSManagedObject 子类上无法设置 Bool 类型属性呢?这是一个 bug 吗?让我们继续探讨。解决方案 - 使用 NSNumber虽然在 NSManagedObject 子类上无法直接设置 Bool 类型属性,但我们可以使用 NSNumber 类型来解决这个问题。NSNumber 类型是一个 Objective-C 类型,可以表示各种数据类型,包括 Bool 类型。让我们来修改我们的 Person 类,将 isEmployed 属性的类型从 Bool 修改为 NSNumber。
Swiftimport CoreDataclass Person: NSManagedObject { @NSManaged var isEmployed: NSNumber?}现在,我们可以在子类中设置 isEmployed 属性,只需要将 Bool 值包装在 NSNumber 中即可。Swiftlet person = Person()person.isEmployed = NSNumber(value: true)这样,我们就成功地设置了 isEmployed 属性,并且不会再遇到编译错误。在使用 Swift 和 CoreData 进行开发时,有时候会遇到一些奇怪的问题。在 NSManagedObject 的子类上无法设置 Bool 类型属性就是其中之一。尽管这可能是一个 bug,但我们可以使用 NSNumber 类型来解决这个问题。将 Bool 值包装在 NSNumber 中,然后在子类中设置属性即可。虽然这个问题可能会带来一些困扰,但通过了解解决方案,我们可以继续进行开发,并成功地使用 CoreData 进行数据持久化。
Copyright © 2025 IZhiDa.com All Rights Reserved.
知答 版权所有 粤ICP备2023042255号