如何使NSManaged public var
成为可选的布尔值?当我键入以下内容时:
import Foundation
import CoreData
import UIKit
extension SomeClass {
@NSManaged public var isLiked: Bool?
@NSManaged public var isDisliked: Bool?
}
我收到错误:
无法将属性标记为@NSManaged,因为其类型无法在Objective-C中表示
我想要的是一个既不能liked
又不能disliked
的属性。
答案 0 :(得分:4)
如果您使用@NSManaged
,则必须遵守其规则。这些规则包括与ObjC合作,后者没有选项。但即使使用Core Data,也不必使用@NSManaged
。只要您实现自己的访问器,就可以删除它。类似的东西:
public var isLiked : Bool? {
get {
willAccessValue(forKey: "isLiked")
let isLiked = primitiveValue(forKey: "isLiked") as! Int64
didAccessValue(forKey: "isLiked")
return isLiked
}
set {
willChangeValue(forKey: "isLiked")
setPrimitiveValue(newValue, forKey: "isLiked")
didChangeValue(forKey: "isLiked")
}
}
答案 1 :(得分:0)
Tom Harrington的答案是正确的,因为@NSManaged类型必须与ObjC一起使用。但是,问题不在于可选类型。 @NSManaged类型可以是可选的,例如:
@NSManaged var someProperty: String?
这里的问题是Swift Bool类型。 Swift的Bool是一个对象,与ObjC基本类型BOOL不同。对于具有布尔属性的CoreData实体,应使用NSNumber?在代码中键入@NSManaged属性。然后,类似于Tom的答案,您可以设置一个单独的Bool访问器属性来获取/设置@NSManaged NSNumber属性,例如:
// the "liked" property is a Boolean attribute in your CoreData entity
@NSManaged var liked: NSNumber?
var isLiked: Bool? {
get { return Bool(exactly: liked) }
set { liked = NSNumber(booleanLiteral: newValue) }
}
通过isLiked
属性,您可以像在Bool中一样在代码中使用它,但在CoreData的幕后,它将值存储为CoreData实体中Boolean属性的NSNumber。
答案 2 :(得分:0)
如果您将 Codegen 设置为手动,这可能是您遇到该问题的原因。您必须确保在创建 NSObject
子类时所有属性都是预设的,之后不需要添加其他属性。
如果您在已经创建 NSObject
子类之后尝试添加新属性,则会出现此错误。
我的解决方案:删除您的子类和属性文件,然后返回到您的 .xcdatamodeld
文件并使用您想要的所有属性重新生成它们。