プロパティリストでの数値の使用


Core Foundation のプロパティリストでは、C の数値データ値を直接使用することはできません。Core Foundation は、C の数値を CFNumber オブジェクトに変換する関数 CFNumberCreate を提供します。これは、プロパティリストで数値を使用するために必須の形式です。


CFNumber オブジェクトは、単純に C の数値のカバーとして機能します。Core Foundation には、CFNumber を作成し、その値を取得し、2つの CFNumber オブジェクトを比較する関数が含まれています。CFNumber オブジェクトは値に対して不変ですが、型情報は維持されないことに注意して下さい。CFNumber オブジェクトの型に関する情報を取得できますが、これは CFNumber オブジェクトが値を格納するために使用した型であり、元の C データと同じ型 ではない可能性が あります。


CFNumber オブジェクトを比較すると、変換と比較は、C の昇格と比較規則ではなく、人間的な期待に従います。負のゼロは正のゼロよりも小さく比較されます。正の無限大は、それが等しいとみなされるそれ自身を除いた、すべてのものよりも大きく比較されます。負の無限大は、それが等しく比較されるそれ自身を除いた、全てより小さく比較されます。標準的な方法とは異なり、両方の数値が NaN である場合、それらは等しいと見なされます。一方の数値だけが NaN である場合、NaN は、負の数であれば他の数よりも大きく、正の数であれば他の数よりも小さくなります。


リスト 1 は、16 ビット整数から CFNumber オブジェクトを作成し、CFNumber オブジェクトに関する情報を取得する方法を示します。


リスト 1 : 整数から CFNumber オブジェクトを作成する


Int16               sint16val = 276;
CFNumberRef         aCFNumber;
CFNumberType        type;
Int32               size;
Boolean             status;
 
// Make a CFNumber from a 16-bit integer.
aCFNumber = CFNumberCreate(kCFAllocatorDefault,
                           kCFNumberSInt16Type,
                           &sint16val);
 
// Find out what type is being used by this CFNumber.
type = CFNumberGetType(aCFNumber);
 
// Now find out the size in bytes.
size = CFNumberGetByteSize(aCFNumber);
 
// Get the value back from the CFNumber.
status = CFNumberGetValue(aCFNumber,
                          kCFNumberSInt16Type,
                          &sint16val);


リスト 2 は、別の CFNumber オブジェクトを作成し、リスト 1 で作成したものと比較します。


リスト 2 : 2 つの CFNumber オブジェクトの比較


CFNumberRef         anotherCFNumber;
CFComparisonResult  result;
 
// Make a new CFNumber.
sint16val = 382;
anotherCFNumber = CFNumberCreate(kCFAllocatorDefault,
                        kCFNumberSInt16Type,
                        &sint16val);
 
// Compare two CFNumber objects.
result = CFNumberCompare(aCFNumber, anotherCFNumber, NULL);
 
switch (result) {
    case kCFCompareLessThan:
        printf("aCFNumber is less than anotherCFNumber.\n");
        break;
    case kCFCompareEqualTo:
        printf("aCFNumber is equal to anotherCFNumber.\n");
        break;
    case kCFCompareGreaterThan:
        printf("aCFNumber is greater than anotherCFNumber.\n");
        break;
}


前の章 次の章



目次
Xcode 10 の新機能

  • Core Foundation 用プロパティリストプログラミングトピックへの序言
  • この文書の構成
    プロパティリストの構造と内容
    プロパティリストの作成
    プロパティリストの保存と復元
    プロパティリストでの数値の使用
    プロパティリストの XML タグ
    文書改訂履歴












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)