Swift + CoreData:无法在 NSManagedObject 子类上设置 Bool - Bug

swift

1个回答

写回答

lilinine

2025-06-15 17:00

+ 关注

Swift
Swift

使用 Swift 和 CoreData 进行开发时,有时候会遇到一些奇怪的问题。其中之一是在 NSManagedObject 的子类上无法设置 Bool 类型属性的问题。在这篇文章中,我们将探讨这个问题,并提供一个解决方案。

在使用 CoreData 进行数据持久化时,我们通常会创建 NSManagedObject 的子类来表示数据模型。这样做可以使代码更加清晰和易于管理。然而,有时候在子类上设置 Bool 类型的属性时,会出现问题。

让我们来看一个简单的例子。假设我们有一个名为 Person 的实体,其中有一个名为 isEmployed 的属性,它是一个 Bool 类型。我们可以创建一个名为 Person 的 NSManagedObject 子类,然后在其中添加一个名为 isEmployed 的属性。

Swift

import CoreData

class Person: NSManagedObject {

@NSManaged var isEmployed: Bool

}

一切看起来都很正常,但是当我们尝试在子类中设置 isEmployed 属性时,却发现无法实现。下面是一个尝试设置 isEmployed 属性的例子:

Swift

let person = Person()

person.isEmployed = true

然而,当我们尝试编译代码时,会遇到一个编译错误,提示我们无法给 Bool 类型的属性赋值。这是一个奇怪的问题,尤其是考虑到其他数据类型,如 String 或 Int,可以正常设置。

那么,为什么在 NSManagedObject 子类上无法设置 Bool 类型属性呢?这是一个 bug 吗?让我们继续探讨。

解决方案 - 使用 NSNumber

虽然在 NSManagedObject 子类上无法直接设置 Bool 类型属性,但我们可以使用 NSNumber 类型来解决这个问题。NSNumber 类型是一个 Objective-C 类型,可以表示各种数据类型,包括 Bool 类型。

让我们来修改我们的 Person 类,将 isEmployed 属性的类型从 Bool 修改为 NSNumber。

Swift

import CoreData

class Person: NSManagedObject {

@NSManaged var isEmployed: NSNumber?

}

现在,我们可以在子类中设置 isEmployed 属性,只需要将 Bool 值包装在 NSNumber 中即可。

Swift

let person = Person()

person.isEmployed = NSNumber(value: true)

这样,我们就成功地设置了 isEmployed 属性,并且不会再遇到编译错误。

在使用 Swift 和 CoreData 进行开发时,有时候会遇到一些奇怪的问题。在 NSManagedObject 的子类上无法设置 Bool 类型属性就是其中之一。尽管这可能是一个 bug,但我们可以使用 NSNumber 类型来解决这个问题。将 Bool 值包装在 NSNumber 中,然后在子类中设置属性即可。

虽然这个问题可能会带来一些困扰,但通过了解解决方案,我们可以继续进行开发,并成功地使用 CoreData 进行数据持久化。

举报有用(4分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号