53

コア データ属性の 1 つをブール値として設定しました。今、それを設定する必要がありますが、XCode は、setUseGPS に応答しない可能性があることを通知し続けます。

[ride setUseGPS: useGPS.on];

コアデータにブール値を設定する方法は何ですか? 私の他のすべての属性はこのように設定されており、うまく機能しています。では、ブール値がこのように設定されない理由がわかりませんか?

4

4 に答える 4

134

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;
于 2010-05-30T11:11:11.273 に答える
18

受け入れられた回答の代替アプローチとして、次のように、管理オブジェクト インターフェイス定義で入力を 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 を生成します。

クリスに感謝します。これが誰かの役に立てば幸いです。

于 2011-04-01T09:20:39.100 に答える
0

これに対する「修正」(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"];
}
于 2010-06-16T08:16:11.880 に答える