コア データ属性の 1 つをブール値として設定しました。今、それを設定する必要がありますが、XCode は、setUseGPS に応答しない可能性があることを通知し続けます。
[ride setUseGPS: useGPS.on];
コアデータにブール値を設定する方法は何ですか? 私の他のすべての属性はこのように設定されており、うまく機能しています。では、ブール値がこのように設定されない理由がわかりませんか?
Core Data にはブール型が「ありません」(ありますが、NSNumber です)。
したがって、useGPS = YES と同等の設定を行います。
[entity setUseGPS:[NSNumber numberWithBool:YES]];
そしてその逆:
BOOL isGPSOn = [[entity useGPS] boolValue];
更新: SKG が指摘したように、Objetive-C のリテラルを使用すると、より簡単な方法で実行できるようになりました。
[entity setUseGPS:@YES];
BOOL isGPSOn = entity.useGPS.boolValue;
受け入れられた回答の代替アプローチとして、次のように、管理オブジェクト インターフェイス定義で入力を NSNumber* から BOOL に変更するだけです。
@property (nonatomic) BOOL useGPS; // Notice that the 'retain' is also removed as we're now dealing with a scalar rather than an NSObject
さまざまな代替アプローチがここで議論されていますが、特にChris Hansonの応答は私にとって最も啓発的でした:
必要な数値属性 (ブール属性を含む) がある場合は、代わりにスカラーとして入力するだけで、Core Data が正しいことを行います。
@property (非アトミック) BOOL isDone;
属性がオプションの場合でも、それは機能します。「存在しない」と「false」を混同するだけです。
より整合性のとれた Cocoa 実装の場合:
もう 1 つの方法は、プロパティに「done」という名前を付けて、getter を「isDone」と指定することです。これは通常の Cocoa 命名規則です。
@property (nonatomic, getter=isDone) BOOL done;
次に、「if (item.done) { ... }」または「item.done = NO;」と記述できます。コンパイラは、プロパティのアクセスに対して -isDone を生成します。
クリスに感謝します。これが誰かの役に立てば幸いです。
これに対する「修正」(IMHO、AppleのSDKのバグ)は、CoreDataで生成されたクラスに次のコードを追加することです。注意:これをカテゴリ内の別のファイルで行う場合、Xcode内でCoreDataクラスを再生成するたびに再コピー/貼り付けする必要はありません。
- (BOOL)useGPS
{
[self willAccessValueForKey:@"useGPS"];
BOOL myuseGPS = [[self primitiveUseGPS] boolValue];
[self didAccessValueForKey:@"useGPS"];
return myuseGPS;
}
- (void)setUseGPS:(BOOL)newValue
{
[self willChangeValueForKey:@"useGPS"];
[self setPrimitiveUseGPS:[NSNumber numberWithBool:newValue]];
[self didChangeValueForKey:@"useGPS"];
}