البرمجة

ترميز القيم الاختيارية في Swift باستخدام NSCoding

في محاولتك لتعريف خصائص كلاس مخصص باعتبارها اختيارية (Optional)، حيث قمت بتعريف String و Int كـ Optionals، وواجهتك صعوبات في ترميزها وفك ترميزها باستخدام NSCoding في لغة البرمجة Swift. يبدو أن لديك استفسار حول كيفية التعامل مع القيم الرقمية Int كـ Optionals عند الترميز والفك ترميز.

لحل هذه المشكلة، يجب عليك تعديل الطريقة التي تقوم بها بترميز وفك ترميز القيمة الرقمية Int. يمكنك استخدام NSKeyedArchiver و NSKeyedUnarchiver لتحقيق هذا الهدف بشكل صحيح. إليك كيفية تحقيق ذلك:

في دالة الترميز encodeWithCoder:

swift
func encodeWithCoder(aCoder: NSCoder) { if let myInt = myInt { aCoder.encodeInteger(myInt, forKey: "MyInt") } else { aCoder.encodeObject(nil, forKey: "MyInt") } aCoder.encodeObject(myString, forKey: "MyString") }

هنا قمنا بفحص إذا كانت قيمة myInt موجودة، في حالة الوجود قمنا بترميزها باستخدام encodeInteger، وإذا كانت غير موجودة (nil) قمنا بترميز nil باستخدام encodeObject.

ثم في دالة فك الترميز initWithCoder:

swift
required init?(coder aDecoder: NSCoder) { if let decodedInt = aDecoder.decodeObjectForKey("MyInt") as? Int { myInt = decodedInt } else { myInt = nil } myString = aDecoder.decodeObjectForKey("MyString") as? String }

هنا قمنا بفحص إذا كانت القيمة المرمزة لـ “MyInt” هي Int، في حالة الوجود قمنا بتخزينها في myInt، وإذا كانت القيمة هي nil قمنا بتعيين myInt إلى nil.

باستخدام هذا النهج، يمكنك التعامل مع القيم الرقمية Int كـ Optionals بشكل صحيح أثناء ترميزها وفك ترميزها. يجب أن تلاحظ أن NSKeyedArchiver و NSKeyedUnarchiver تعتمد على encodeObject و decodeObject حتى لو كانت القيمة هي Int، ولذا يتم استخدامها لترميز وفك ترميز الـ Optionals بشكل صحيح.

المزيد من المعلومات

بالتأكيد، سأقدم لك فهمًا أكثر تفصيلا حول كيفية ترميز وفك ترميز القيم الاختيارية في Swift باستخدام NSCoding.

أولاً وقبل كل شيء، يُلاحظ أن NSCoding يتعامل بشكل مختلف مع الأنواع الاختيارية، مثل String؛ حيث يُمكن ترميزها وفك ترميزها بشكل طبيعي. ولكن القيم الرقمية، مثل Int، لا يمكن ترميزها مباشرة باستخدام NSCoding عندما تكون اختيارية.

لتجنب الخطأ الذي تظهره عند محاولة ترميز القيمة الاختيارية Int، يمكنك تحويلها إلى NSNumber قبل ترميزها، حيث يمكن لـ NSCoding التعامل مع NSNumber. لذلك، يمكنك تعديل دالة الرمزة لتبدو كما يلي:

swift
func encodeWithCoder(aCoder: NSCoder) { if let myInt = myInt { aCoder.encodeObject(NSNumber(value: myInt), forKey: "MyInt") } aCoder.encodeObject(myString, forKey: "MyString") }

هذا السياق يسمح لك بترميز القيمة الاختيارية Int بشكل صحيح. عند فك ترميزها، يمكنك استخدام decodeObjectForKey ثم تحويل الناتج إلى Int اختياري كما هو موضح في الدالة المخصصة لفك الترميز.

تحاول الأكواد المقدمة أدناه معالجة هذا المشكلة بشكل فعّال:

swift
required init?(coder aDecoder: NSCoder) { myString = aDecoder.decodeObject(forKey: "MyString") as? String if let number = aDecoder.decodeObject(forKey: "MyInt") as? NSNumber { myInt = number.intValue } else { myInt = nil } } func encode(with aCoder: NSCoder) { aCoder.encodeObject(myString, forKey: "MyString") if let myInt = myInt { aCoder.encodeObject(NSNumber(value: myInt), forKey: "MyInt") } }

باستخدام هذا النهج، يمكنك التعامل بشكل صحيح مع القيم الاختيارية للأنواع الرقمية أثناء ترميز وفك ترميز البيانات باستخدام NSCoding.

مقالات ذات صلة

زر الذهاب إلى الأعلى
إغلاق

أنت تستخدم إضافة Adblock

يرجى تعطيل مانع الإعلانات حيث أن موقعنا غير مزعج ولا بأس من عرض الأعلانات لك فهي تعتبر كمصدر دخل لنا و دعم مقدم منك لنا لنستمر في تقديم المحتوى المناسب و المفيد لك فلا تبخل بدعمنا عزيزي الزائر