web-dev-qa-db-ja.com

iPhone:ブール値をコアデータに保存する

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

[ride setUseGPS: useGPS.on];

コアデータにブール値を設定する方法は何ですか?私の他のすべての属性はこのように設定されており、非常に効果的です。だから、なぜブール値がこのように設定されないのか分かりませんか?

53
Nic Hubbard

コアデータにはブール型が「ありません」(ありますが、NSNumberです)。

したがって、useGPS = YESと同等の値を設定します。

[entity setUseGPS:[NSNumber numberWithBool:YES]];

その他の方法:

BOOL isGPSOn = [[entity useGPS] boolValue];

更新: SKGが指摘したように、Objetive-Cのリテラルを使用すると、より簡単な方法で実行できます。

[entity setUseGPS:@YES];

BOOL isGPSOn = entity.useGPS.boolValue;
133
RickiG

受け入れられた答えへの代替アプローチとして、次のように、マネージドオブジェクトインターフェイス定義で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

さまざまな代替アプローチについて説明します ここ ですが、 クリスハンソン の応答は、特に私にとって最も印象的でした。

必要な数値属性(ブール属性を含む)がある場合は、代わりにそれをスカラーとして入力するだけで、Core Dataは正しいことを行います。

@property(nonatomic)BOOL isDone;

属性がオプションである場合でも、それは機能します-「存在しない」と「false」を混同するだけです。

そして、より整合したCocoa実装の場合:

あなたがしたいもう一つのことは、プロパティに「完了」という名前を付け、ゲッターを「isDone」として指定することです。これが通常のCocoaの命名規則です。

@property(nonatomic、getter = isDone)BOOL done;

次に、「if(item.done){...}」または「item.done = NO;」と書くことができます。コンパイラーは引き続き、プロパティへのアクセス用に-isDoneを生成します。

クリスに感謝し、これが誰かを助けることを願っています。

18
paulkmoore

@RickiGの答えを補完するために、Swift(少なくともv4.2以降))でNSNumberからBoolを作成する方法とその逆の方法は次のとおりです。

let nsNumberFromBool = NSNumber(booleanLiteral: true) // or false
let boolFromNSNumber = nsNumberFromBool.boolValue
2

これの「修正」(私見、AppleのSDKのバグ)は、CoreDataで生成されたクラスに次のコードを追加することです。 NB:これを別のファイルのカテゴリで行う場合、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"];
}
0
Adam