سؤال

أرغب في تخزين cgpoint الخاص بي إلى مجموعة nsmutable ، لذلك ، لدي طريقة مثل هذه:

[self.points addObject:CGPointMake(x, y)];

لكنني تعرضت للخطأ ، قال:

نوع غير متوافق للوسيطة 1 من "AddObject".

لذلك ، أتحقق من واجهة برمجة التطبيقات ،

- (void)addObject:(id)anObject

anobject الكائن لإضافته إلى نهاية محتوى جهاز الاستقبال. يجب ألا تكون هذه القيمة صفر.

لذلك ، أعتقد ""cgpointmake"يمكن أن يصنع كائنًا ، لكن لا يمكن تعيينه. ماذا يحدث؟

هل كانت مفيدة؟

المحلول

المشكلة هي أن CGPoint هو في الواقع مجرد بنية C ، فهي ليست كائنًا:

struct CGPoint {
   CGFloat x;
   CGFloat y;
};
typedef struct CGPoint CGPoint;

إذا كنت على iPhone ، يمكنك استخدام إضافات NSValue Uikit لتحويل CGPoint إلى كائن NSValue.

انظر هذه الإجابة السابقة للأمثلة: كيف يمكنني إضافة كائنات cgpoint إلى nsarray بالطريقة السهلة؟

نصائح أخرى

يمكنك أيضًا القيام بما يلي:

[myArray addObject:[NSValue valueWithCGPoint:MyCGPoint]];

لسوء الحظ بالنسبة لك ، فإن CGPOINT ليس كائنًا لـ COBSIVE-C. إنه بنية AC. إذا قمت بنقر مزدوجًا على Apple على cgpoint ، فيجب عليك القفز إلى التعريف

struct CGPoint {
    CGFloat x;
    CGFloat y;
};
typedef struct CGPoint CGPoint;

إذا كنت ترغب في تخزين cgpoint في nsarray ، فستحتاج إلى لفها أولاً. يمكنك استخدام NSValue لهذا أو كتابة الغلاف الخاص بك.

نرى تحويل cgpoint إلى nsvalue

تحرير> هناك صناديق صغيرة لكل استدعاء طريقة Objective-C ، وإنشاء وتدمير الكائنات يتضمن العديد من مكالمات الطرق قبل استخدامها حتى في أي شيء. يجب ألا تقلق بشأن هذا بشكل طبيعي ولكن بالنسبة للكائنات الصغيرة جدًا التي تغلف القليل من السلوك والتي لها عمر قصير يمكن أن تؤثر على الأداء. إذا استخدمت Apple كائنات لجميع النقاط ، فإن المستقيم والأحجام وحتى ints ، والأداء ، وما إلى ذلك ، سيكون أسوأ.

للبناء على الإجابة التي قدمها Atbreuer11 ، يمكنك تحويل CGPoint الخاص بك إلى NSValue ، وتخزينها في nsmutablearray وتحويلها مرة أخرى باستخدام ما يلي:

//Convert CGPoint and Store it
CGPoint pointToConvert = CGPointMake(100.0f, 100.0f);
NSValue *valueToStore = [NSValue valueWithCGPoint:pointToConvert];
NSMutableArray *arrayToKeep =[NSMutableArray arrayWithObject:valueToStore];

ثم استعدها مرة أخرى:

CGPoint takeMeBack;
for (NSValue *valuetoGetBack in arrayToKeep) {
    takeMeBack = [valuetoGetBack CGPointValue];
    //do something with the CGPoint
}

ربما تكون هذه أسهل طريقة للقيام بذلك. يمكنك كتابة فصل كامل والقيام بجميع أنواع معالجة البيانات ، لكنني أعتقد أنه سيكون مبالغة ، إلا إذا كان عليك ذلك حقًا.

سويفت 3.x
// تحويل cgpoint إلى nsvalue

let cgPoint = CGPoint(x: 101.4, y: 101.0)
let nsValue = NSValue(cgPoint: cgPoint)
var array = NSArray(object: nsValue)

// استعادته مرة أخرى

var cgPoint : CGPoint!
for i in array {
  cgPoint = i as? CGPoint
}

طريقة بسيطة للتعامل معها CGPoint (أو أي غير آخر NSObject الهيكل الموروثة) هو إنشاء فئة جديدة ورث منها NSObject.

الكود أطول ، لكنه نظيف. مثال أدناه:

في ملف .h:

@interface MyPoint:NSObject
{
     CGPoint myPoint;   
}

- (id) init;
- (id) Init:(CGPoint) point;
- (BOOL)isEqual:(id)anObject;

@end

في ملف .M:

@implementation MyPoint
- (id) init
{
    self = [super init];
    myPoint = CGPointZero;
    return self;
}
- (id) Init:(CGPoint) point{
    myPoint.x = point.x;
    myPoint.y = point.y;
    return self;
}
- (BOOL)isEqual:(id)anObject
{
    MyPoint * point = (MyPoint*) anObject;
    return CGPointEqualToPoint(myPoint, point->myPoint);
}

@end

إليك بعض عينة الكود التي تظهر الاستخدام ، لا تنسى ذلك إطلاق سراح!!!

//init the array
NSMutableArray *pPoints;
pPoints = [[NSMutableArray alloc] init];

// init a point
MyPoint *Point1 = [[MyPoint alloc]Init:CGPointMake(1, 1)];


// add the point to the array
[pPoints addObject:[[MyPoint alloc] Point1]];

//add another point
[Point1 Init:CGPointMake(10, 10)];
[pPoints addObject:[[MyPoint alloc] Point1]];

[Point1 Init:CGPointMake(3, 3)];
if ([pPoints Point1] == NO))
   NSLog(@"Point (3,3) is not in the array");

[Point1 Init:CGPointMake(1, 1)];
if ([pPoints Point1] == YES))
   NSLog(@"Point (1,1) is in the array");
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top