Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 核心数据和BOOL设置_Iphone_Core Data_Ipad - Fatal编程技术网

Iphone 核心数据和BOOL设置

Iphone 核心数据和BOOL设置,iphone,core-data,ipad,Iphone,Core Data,Ipad,我正在开发一个应用程序,它使用核心数据作为后端来管理SQLite记录。我用字符串和数字处理一切,但只是尝试添加布尔字段,似乎无法使事情正常进行 在.xcdatamodel中,我向我的对象添加了一个名为isCurrentlyForSale的字段,该字段不是可选的,不是暂时的,也没有索引。属性的类型设置为布尔型,默认值为NO 当我从数据模型创建类文件时,在.h头中为此属性添加的样板代码是: @property (nonatomic, retain) NSNumber * isCurrentlyFor

我正在开发一个应用程序,它使用核心数据作为后端来管理SQLite记录。我用字符串和数字处理一切,但只是尝试添加布尔字段,似乎无法使事情正常进行

在.xcdatamodel中,我向我的对象添加了一个名为
isCurrentlyForSale
的字段,该字段不是可选的,不是暂时的,也没有索引。属性的类型设置为布尔型,默认值为NO

当我从数据模型创建类文件时,在.h头中为此属性添加的样板代码是:

@property (nonatomic, retain) NSNumber * isCurrentlyForSale;
随着

@dynamic isCurrentlyForSale;
在.m实现文件中

我一直把布尔人当作简单的布尔人。我读到过,我可以使用NSNumber的
numberWithBool
boolValue
方法,但对于如此简单的东西,这似乎是一个非常多的额外代码

标题中的@property是否可以更改为简单BOOL?如果有,有什么需要注意的吗

谢谢
-John

简单回答:不,您不能更改
@属性
声明以返回
BOOL

不过,您可以编写一些简单的包装。我将属性重命名为
currentlyForSale
(这意味着它将生成
currentlyForSale
setCurrentlyForSale:
),然后编写两个包装器:

- (BOOL) isCurrentlyForSale {
  return [[self currentlyForSale] boolValue];
}

- (void) setIsCurrentlyForSale:(BOOL)forSale {
  [self setCurrentlyForSale:[NSNumber numberWithBool:forSale]];
}

虽然Dave DeLong的答案很接近,但实际上您可以做到这一点,而无需更改属性的名称

您可以更改属性以返回一个
BOOL
,但是您需要手工编写访问器方法,它们与Dave在其响应中的方法有些不同

首先,您的
@属性应定义为:

@property (nonatomic, getter=isCurrentlyForSale) BOOL currentlyForSale;
然后在实现文件中,直接创建访问器,而不是声明
@dynamic
属性

- (BOOL)isCurrentlyForSale
{
  [self willAccessValueForKey:@"currentlyForSale"];
  BOOL b = [[self primitiveValueForKey:@"currentlyForSale"] boolValue];
  [self didAccessValueForKey:@"currentlyForSale"];
  return b;
}

- (void)setCurrentlyForSale:(BOOL)b
{
  [self willChangeValueForKey:@"currentlyForSale"];
  [self setPrimitiveValue:[NSNumber numberWithBool:b] forKey:@"currentlyForSale"];
  [self didChangeValueForKey:@"currentlyForSale"];
}

使用这些访问器,您的对象将为您处理装箱,您可以将其作为基本值进行访问。另外,以
setIs
开头的setter不是一个好主意,因此在示例代码中删除它。

setter或属性都不应该包含“is”。这就是为什么
@property
具有
getter=
设置的原因。是的,您可以使用作为核心数据一部分的基本访问器将
@属性更改为BOOL。@Marcus是的,我知道setter中不应该有
Is
,但我把它放进去了,因为
setCurrentlyForSale:
已经被CD占用了(我知道
getter=
setter=
。你是说你可以将标题中的
NSNumber*
更改为
BOOL
,它会起作用吗?这肯定会让我吃惊。+1啊,我明白你现在说的。我以为你是在暗示你可以将
@属性更改为
BOOL
,不实现自定义方法。顺便说一句,setter有点不正确。只有在新值实际不同时(即,您需要if语句),才应调用
(will | did)ChangeValueForKey:
。我要补充的唯一一点是,我喜欢使用NSString常量作为键名,这样可以避免以后在排除印刷错误时遇到麻烦。
NSString*const CurrentlyForSale=@“CurrentlyForSale”;