Xcode:CoreData 生成的属性是“double”而不是“NSNumber”
Posted
技术标签:
【中文标题】Xcode:CoreData 生成的属性是“double”而不是“NSNumber”【英文标题】:Xcode: CoreData generated property is "double" instead of "NSNumber" 【发布时间】:2019-09-02 12:40:11 【问题描述】:我在使用 CoreData 时遇到问题:
数据模型有多个类型为Double
的字段:
所以,我希望生成的 CoreData 属性具有相同的类型,但是,它们不是:
@property (nullable, nonatomic, copy) NSNumber *amount;
@property (nonatomic) double iccsMaterialAmountIfDifferentThanPlanItem;
这种行为的根本原因是什么,是错误吗?如果是,如何解决?
【问题讨论】:
在数据模型检查器中的use scalar type
中设置复选标记。
【参考方案1】:
这是 Xcode 自动生成类的默认行为,您可以在属性上选择 Use scalar type
来更改它:
来自doc:
使用标量类型(可选)对于某些类型,在标量和 代码生成期间的非标量表示。对于双人间, 选择 Use Scalar 复选框会产生一个 Double,同时离开它 unselected 产生一个 NSNumber。有关类型的完整列表,包括 标量变体,请参阅 NSAttributeType。
【讨论】:
【参考方案2】:根据我们的经验,数字模型和 plist 数据类型是没有意义的。他们都是NSNumber。在您的代码中,您必须将这些读取为 NSNumber,然后转换为 int、double、float 或 string。至少在目标 C 中。
这里是一个数字到字符串转换的例子:
+ (NSString *) numberToString:(NSNumber *)dbNumberIn
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
formatter.numberStyle = NSNumberFormatterDecimalStyle;
formatter.formatWidth = 5;
formatter.paddingCharacter = @" ";
formatter.maximumIntegerDigits = 6;
formatter.minimumFractionDigits = 2;
formatter.maximumFractionDigits = 2;
formatter.usesSignificantDigits = NO;
formatter.usesGroupingSeparator = YES;
formatter.groupingSeparator = @",";
formatter.decimalSeparator = @".";
NSString *stringFieldOut = [formatter stringFromNumber:dbNumberIn];
return stringFieldOut;
【讨论】:
以上是关于Xcode:CoreData 生成的属性是“double”而不是“NSNumber”的主要内容,如果未能解决你的问题,请参考以下文章
Xcode 12.2+生成SwiftUI 2.0 CoreData模板预览时崩溃问题的解决
Xcode 12.2+生成SwiftUI 2.0 CoreData模板预览时崩溃问题的解决
iPhone CoreData 属性:对 managedObjects 的更改太慢