NSNumber 中的错误值,未定义 CFNumberType
Wrong value in NSNumber, CFNumberType not defined
全部,
我创建了一个包含 3 个字段的数据模型:
- 播放类型 int16
- 仓位类型 int16
- 播放类型 int16
我已经为它生成了一个class。
Tile.h
@property (nonatomic, retain) NSNumber * beingPlayed;
@property (nonatomic, retain) NSNumber * playedBy;
@property (nonatomic, retain) NSNumber * position;
Tile.m
@dynamic beingPlayed;
@dynamic playedBy;
@dynamic position;
我假设所有 3 个变量都是 NSNumbers 并且类型为 int16 (CFNumberType = kCFNumberSInt16Type)。
当我创建 Tile 对象时,我将所有参数设置为 0 [NSNumber numberwithint:0]
但是当我想为这个对象设置另一个值时,没有设置beingPlayed的类型,所以这个值不正确。
我用过:
self.beingPlayed = self.playedBy = self.position = [NSNumber numberWithInt:175];
结果:
位置 = 175
播放次数 = 175
正在播放 = -81
我用过:
self.playedBy = self.position = [NSNumber numberWithInt:175];
self.beingPlayed = self.position;
结果:
位置 = 175
播放次数 = 175
正在播放 = -81
当我调试时,我看到:
- 仓位类型为 kCFNumberSInt16Type
- playedBy 的类型为 kCFNumberSInt32Type
- beingPlayed 有 NO 类型....
这是怎么回事?在哪里可以设置类型或者类型在哪里设置?
我的问题是它现在是一个普通的 int,只能包含小于 127 的值,但我已将数据模型中的类型设置为 int16....
编辑:
来自评论的 OP 的附加代码:
Tile *newTile = [NSEntityDescription
insertNewObjectForEntityForName:@"Tile" inManagedObjectContext:context];
newTile.playedBy = @(129);
newTile.position = @(129);
newTile.beingPlayed = @(129);
[context save:&error];
Logging: playedBy = -127, position = 129 and beingPlayed = 129
这是您需要了解的内容:生成的 NSManagedObject
子类对所有数字使用 objects 而不是 primitives。也可以使用基元,但保留 Xcode 编辑器创建它们的方式有一些优势。
简而言之,您需要了解 C 中的对象只是指向该对象的指针。所以这个指针的 value 与你无关。 SDK 提供了包装和解包 NSNumber
对象的明显方法。
// set
position = @3994;
// get
NSInteger p1 = position.integerValue;
int p2 = position.intValue;
BOOL p3 = position.boolValue;
// modify
position = @(position.integerValue + 1);
// compare
position.integerValue == position2.integerVaue // true if equal
您的链式赋值不起作用,因为 =
在处理对象与值时的含义不同。
NSNumber *x, *y;
x = @1; // assign value to x
y = x; // y points to x
此外,请确保您没有覆盖任何可能也会更改结果的 getter 或 setter。
"Also, make sure that you are not overriding any getters or setters
that could potentially also change the result."
成功了!我有一个方法 (BOOL)isBeingPlayed,它也是 KVC 实现的一部分,因此是 setters/getters 之一……我忘记了。
并且因为 BOOL 在 basic 中也是 int,所以类型被转换为 int 而不是 int16....
谢谢大家的帮助!
全部,
我创建了一个包含 3 个字段的数据模型:
- 播放类型 int16
- 仓位类型 int16
- 播放类型 int16
我已经为它生成了一个class。
Tile.h
@property (nonatomic, retain) NSNumber * beingPlayed;
@property (nonatomic, retain) NSNumber * playedBy;
@property (nonatomic, retain) NSNumber * position;
Tile.m
@dynamic beingPlayed;
@dynamic playedBy;
@dynamic position;
我假设所有 3 个变量都是 NSNumbers 并且类型为 int16 (CFNumberType = kCFNumberSInt16Type)。
当我创建 Tile 对象时,我将所有参数设置为 0 [NSNumber numberwithint:0]
但是当我想为这个对象设置另一个值时,没有设置beingPlayed的类型,所以这个值不正确。
我用过:
self.beingPlayed = self.playedBy = self.position = [NSNumber numberWithInt:175];
结果:
位置 = 175
播放次数 = 175
正在播放 = -81
我用过:
self.playedBy = self.position = [NSNumber numberWithInt:175];
self.beingPlayed = self.position;
结果:
位置 = 175
播放次数 = 175
正在播放 = -81
当我调试时,我看到:
- 仓位类型为 kCFNumberSInt16Type
- playedBy 的类型为 kCFNumberSInt32Type
- beingPlayed 有 NO 类型....
这是怎么回事?在哪里可以设置类型或者类型在哪里设置?
我的问题是它现在是一个普通的 int,只能包含小于 127 的值,但我已将数据模型中的类型设置为 int16....
编辑:
来自评论的 OP 的附加代码:
Tile *newTile = [NSEntityDescription
insertNewObjectForEntityForName:@"Tile" inManagedObjectContext:context];
newTile.playedBy = @(129);
newTile.position = @(129);
newTile.beingPlayed = @(129);
[context save:&error];
Logging: playedBy = -127, position = 129 and beingPlayed = 129
这是您需要了解的内容:生成的 NSManagedObject
子类对所有数字使用 objects 而不是 primitives。也可以使用基元,但保留 Xcode 编辑器创建它们的方式有一些优势。
简而言之,您需要了解 C 中的对象只是指向该对象的指针。所以这个指针的 value 与你无关。 SDK 提供了包装和解包 NSNumber
对象的明显方法。
// set
position = @3994;
// get
NSInteger p1 = position.integerValue;
int p2 = position.intValue;
BOOL p3 = position.boolValue;
// modify
position = @(position.integerValue + 1);
// compare
position.integerValue == position2.integerVaue // true if equal
您的链式赋值不起作用,因为 =
在处理对象与值时的含义不同。
NSNumber *x, *y;
x = @1; // assign value to x
y = x; // y points to x
此外,请确保您没有覆盖任何可能也会更改结果的 getter 或 setter。
"Also, make sure that you are not overriding any getters or setters that could potentially also change the result."
成功了!我有一个方法 (BOOL)isBeingPlayed,它也是 KVC 实现的一部分,因此是 setters/getters 之一……我忘记了。
并且因为 BOOL 在 basic 中也是 int,所以类型被转换为 int 而不是 int16....
谢谢大家的帮助!