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 的更改太慢

Coredata Xcode 8中的“在实体的唯一性约束属性中,逗号不是有效属性”

Xcode 7 中的 CoreData 类

Xcode8使用CoreData如何生成OC和Swift版的SubClass