iOS KVC DRY mutation

أحاول تعيين قاموس من السلاسل من JSON fetch إلى KVC compliant NSManagedObject ، يمكنني استخدام setValue: forKey: بنجاح ، لكنني أخفق في رؤية كيف يمكنني تعيين الأنواع.

على سبيل المثال ، يتعذر عليّ تعيين تاريخ على أي سلسلة عشوائية: وصف الطباعة لـ myDate: asdfsadf </القانون> ومع ذلك عملت.

تلقيت نظرة على https://stackoverflow.com/a/5345023/828859 والتي قدمت بعض الإجابات المفيدة. يمكنني الدخول وإنشاء التحقق لكل خاصية واحدة ... ولكن هذا لا يبدو جافًا جدًا لأنه لا بد من التحقق من صحة كل تاريخ وتعيين القيمة الخارجية بشكل منفصل في كل مرة لدي موعد.

أفضل التحوير حسب النوع قبل استخدام setValue: forKey: ولكن لا أعرف كيف أميز على نوع الملكية.

ما أريد القيام به:

switch([object typeforkey:key]){
   case @"NSDate":
   //...
   value = mutatedDate
   //...
}
[object setValue:value forKey:key];
0

2 إجابة

انتهى بي الأمر باستخدام قاموس آخر لرسم خرائط نوع الملكية. ثم يقوم كائن تعيين كائن بفحص الكائن المراد وضعه في الخريطة بواسطة هذا البروتوكول المحدد ويستخدم قاموس نوع الخاصية لتحويل كل خاصية قبل استخدام setValue: forKey: .

0
وأضاف

يمكنك أن تطلب من أي نوع من أنواع الطبقات التي تم إنشاء مثيل لها. حتى تتمكن من القيام بشيء مثل:

id myObject = [myDictionary objectForKey:key];

if ([myObject isKindOfClass:[NSDate class]]) {
   //Do stuff
}
else if ([myObject isKindOfClass:[NSString class]]) {
   //Do other stuff
}

ويرجع ذلك إلى أن الكائنات عبارة عن هياكل تحتوي على مؤشر باسم ivar isa تشير إلى كائن من نوع Class ، لذلك يمكنك دائمًا أن تطلب من أي كائن نوع الفصل الذي يأتي منه .

0
وأضاف
صحيح ، ومع ذلك لم أكن واضحًا في سؤالي ، فإن القاموس يأتي من استجابة JSON ، لذا فهو قاموس من الأوتار.
وأضاف المؤلف MrJD, مصدر
آه لقد فهمت. لا أعتقد أن هناك طريقة نظيفة لفعل ما تريد. تحتاج إما إلى معرفة ما هي المفاتيح في وقت مبكر وأنواعها والتبديل نوع الكائن الخاص بك على أساس ذلك أو تحتاج إلى القيام بحزمة كاملة من مسح السلسلة لمعرفة ما كنت تعمل معه ومن ثم التحقق من الصحة.
وأضاف المؤلف Jack Lawrence, مصدر