プロパティリストでの数値の使用
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; }
前の章 次の章