ترميز / فك CGFloat على 32- مقابل 64 بت
-
20-09-2019 - |
سؤال
وأنا تحويل التطبيق إلى العمل في 64 بت. أبل مستندات الدولة أن نوع CGFloat
هو float
على 32 بت وdouble
على 64 بت.
إذا كان الأمر كذلك، كيف تتعاملون مع ترميز / فك قيمة؟ على سبيل المثال، إذا خلق NSNumber
من CGFloat
، وأود أن استخدام -numberWithFloat:
أو -numberWithDouble:
طريقة NSNumber؟ وينطبق نفس السؤال إلى NSCoder
NSKeyedArchiver
و-encodeFloat:forKey:
الأساليب و-encodeDouble:forKey:
.
هل لديك لكتابة ماكرو مشروط لذلك يطلق التي -numberWithFloat:
على 32 بت و-numberWithDouble:
على 64 بت؟
وماذا يحدث إذا كان المستخدم يقوم بتشغيل إصدار 64 بت من التطبيق يحفظ الملف حيث يتم ترميز هذه القيم كما الزوجي ويتم فتح الملف / استعادتها من الأرشيف على نظام 32 بت؟
وجميع الطرق في تطبيقي أن استخدام CGFloats
من غير المحتمل أن تحتاج أي وقت مضى مستوى من الدقة double
، لذلك يجب أن يكون حتى يبعث على القلق حول هذا الموضوع؟
المحلول
وماذا يحدث إذا كان المستخدم يقوم بتشغيل إصدار 64 بت من التطبيق يحفظ الملف حيث يتم ترميز هذه القيم كما الزوجي ويتم فتح الملف / استعادتها من الأرشيف على نظام 32 بت؟
اقتباس فقرة> لا شيء خاص. الملف يحتوي على double
، ويفترض أن كنت ترسل decodeDouble:forKey:
لاسترداد قيمة، لذلك عليك الحصول على double
. يمكنك ثم يطرح للCGFloat
والتي سوف تفقد الدقة إذا كنت على جهاز 32 بت، ولكن ما عليك فعله أن يلقي عاجلا أو آجلا. (حتى لو كنت التمسك double
، فسوف لا تزال بحاجة الى المدلى بها لCGFloat
عند تمرير القيمة إلى كوارتز / AppKit / UIKit).
والنظر البديل: يمكنك تخزين float
s في ملف على جهاز 64 بت، ومن ثم تحميل الجزء الخلفي الملف في على نفس الجهاز. يمكنك والكوارتز التعامل مع الدقة الكاملة من نوع double
64 بت، ولكن لم يكن لديك، لأنك رمى به بعيدا عندما كتب من الملف. إذا تغيرت قيمة على الإطلاق في المدلى بها، وهذا التغيير هو الآن الدائم.
وهكذا توصيتي هي دائما استخدام نوع double
مع NSKeyedArchiver، إلا إذا كنت تعرف أنك لا م> ذاهب الى استخدام أي شيء ولكن float
(أي، وAPI الهدف يستخدم فقط float
، أبدا double
). هذا ليس صحيحا من الكوارتز، وذلك لCGFloat
، واستخدام double
.