[iphone] أفضل طريقة لتنفيذ Enums مع البيانات الأساسية


Answers

يمكنك القيام بهذه الطريقة ، بطريقة أبسط:

typedef enum Types_e : int16_t {
    TypeA = 0,
    TypeB = 1,
} Types_t;

@property (nonatomic) Types_t itemType;

وفي النموذج الخاص بك ، قم بتعيين itemType ليكون رقمًا 16 بت. كله تمام. لا حاجة لرمز إضافي. وضعت للتو في المعتاد الخاص بك

@dynamic itemType;

إذا كنت تستخدم Xcode لإنشاء فئة فرعية NSManagedObject ، فتأكد من تحديد إعداد " استخدام قيم قياسية لأنواع البيانات البدائية ".

Question

ما هي أفضل طريقة لربط كيانات البيانات الأساسية بقيم التعداد بحيث يمكنني تعيين خاصية نوع للكيان؟ وبعبارة أخرى ، لدي كيان يسمى Item مع خاصية itemType أريد أن itemType ، ما هي أفضل طريقة للقيام بذلك.




إذا كنت تستخدم mogenerator ، فألق نظرة على هذا: https://github.com/rentzsch/mogenerator/wiki/Using-enums-as-types . يمكنك الحصول على سمة Integer 16 تسمى itemType ، مع قيمة attributeValueScalarType في معلومات المستخدم. ثم ، في معلومات المستخدم للكيان الخاص بك ، قم بتعيين additionalHeaderFileName إلى اسم الرأس الذي تم تعريف تعداد Item . عند إنشاء ملفات رأسك ، سيقوم mogenerator تلقائيًا بجعل الخاصية تحتوي على نوع Item .




بما أن التعدادات مدعومة باختصار قياسي ، فلا يمكنك أيضًا استخدام الغلاف NSNumber وتعيين الخاصية مباشرة كقيمة قياسية. تأكد من تعيين نوع البيانات في نموذج البيانات الأساسية على أنه "Integer 32".

MyEntity.h

typedef enum {
kEnumThing, /* 0 is implied */
kEnumWidget, /* 1 is implied */
} MyThingAMaBobs;

@interface myEntity : NSManagedObject

@property (nonatomic) int32_t coreDataEnumStorage;

في مكان آخر في التعليمات البرمجية

myEntityInstance.coreDataEnumStorage = kEnumThing;

أو تحليل من سلسلة JSON أو التحميل من ملف

myEntityInstance.coreDataEnumStorage = [myStringOfAnInteger intValue];



لقد فعلت هذا كثيرًا واعثر على النموذج التالي ليكون مفيدًا:

// accountType
public var account:AccountType {
    get {
        willAccessValueForKey(Field.Account.rawValue)
        defer { didAccessValueForKey(Field.Account.rawValue) }
        return primitiveAccountType.flatMap { AccountType(rawValue: $0) } ?? .New }
    set {
        willChangeValueForKey(Field.Account.rawValue)
        defer { didChangeValueForKey(Field.Account.rawValue) }
        primitiveAccountType = newValue.rawValue }}
@NSManaged private var primitiveAccountType: String?

في هذه الحالة ، يكون التعداد بسيطًا جدًا:

public enum AccountType: String {
    case New = "new"
    case Registered = "full"
}

ونطلق عليه تسمية متحركة ، لكنني استخدم التعدادات لأسماء الحقول ، على النحو التالي:

public enum Field:String {

    case Account = "account"
}

نظرًا لأن ذلك قد يكون شاقًا بالنسبة لنماذج البيانات المعقدة ، فقد كتبت مولدًا برمجيًا يستهلك MOM / الكيانات لبث كل التعيينات. ينتهي مداخلتي إلى أن تكون قاموسًا من جدول / صف إلى نوع التعداد. بينما كنت في ذلك ، ولدت أيضا رمز التسلسل JSON. لقد فعلت ذلك لطرازات معقدة للغاية ، وتبين أنها موفرة الوقت الكبيرة.






Links