سؤال

ولقد تم استخدام وظائف على غرار C، ولكنني علمت للتو أنها لا تستطيع رؤية المتغيرات المثال. لذلك كان نصحت لتحويلها إلى طرق الهدف-C.

NSString* myfunc ( int x )

ويصبح:

- (NSString *)myfunc:(int)x

و

myString = myfunc(x);

ويصبح

myString = [myString myfunc:x];

؟؟

وهذا يجمع مع التحذيرات المشؤومة، ولكن لا يعمل. ما لي يساء فهمه؟

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

المحلول

ويبدو ان المكالمة غير صحيحة. ربما محاولة:

NSString *myString = [self myfunc:x];

نصائح أخرى

وبقدر ما أفهم، يمكنك إرسال رسالة -myfunc: إلى كائن NSString. لذلك يجب تعريف الأسلوب -myfunc: في الصف NSString (أو فئة من NSString).

وإذا كان هذا هو ما تريد أن تفعل، فإنك لا تحتاج إلى العودة الكائن نفسه نتيجة للأسلوب: يمكنك تعديل متغيرات سبيل المثال في تنفيذ الأسلوب. استدعاء الأسلوب (أو رسالة القصيرة) تبدو مثل:

[myString myfunc:x];

إذا كنت تريد إرسال رسالة إلى كائن من فئة أخرى والعودة سلسلة، إعلان الأسلوب الخاص بك هو الصحيح ولكن يجب أن تظهر في تنفيذ صفك والمتلقي للرسالة (وهذا هو البند على اليسار في الساحة بين قوسين) يجب أن تكون من تلك الفئة:

@implementation MyClass
-(NSString *)myfunc:(int)x
{
    NSString * returnString;
    ...// do something with x, returnString and instance variables
    return returnString;
}
@end;
...
MyClass * myobj = [[MyClass alloc] init];
NSString * myString = [myobj myfunc:42];

وأما إجابة الثانية، وأنا أحاول أن أفهم مشكلتك من خلال جميع أسئلتك الأخيرة.

بداية ، كان هناك وظيفة C عودة مؤشر إلى كائن NSString:

NSString * myfunc( int x )
{
           ... // Do something with x
   NSString * myString = @"MYDATA";
           ... // Do something with myString
   return myString;        
}

ثم ، كنت أريد أن أضيف في هذه المهمة بعض التعليمات البرمجية عن كائن UIImage:

image1.image = [UIImage imageNamed:@"image1.png"];

وكان ينصح لك لتحويل وظيفة إلى أسلوب. إذا كنت ترغب في الوصول إلى متغير مثيل .image، وهذه الطريقة يجب أن تنتمي إلى فئة الكائن image1 (دعنا نقول هذا هو الطبقة AlanImage). شيء من هذا القبيل:

@interface AlanImage : NSObject {
    UIImage image;
}
- (NSString *) myfuncWithParam: (int) x;
@end;

@implementation AlanImage
- (NSString *) myfuncWithParam: (int) x
{
    NSString * myString = @"MYDATA";
    image = [UIImage imageNamed:@"image1.png"];
    return myString;        
}
@end

ثالثا، لم يكن يعرف ما كان المتلقي من طريقة. دراساتي تميل إلى أن تؤدي إلى كائن image بك كمرشح جيد:

aNiceString = [image myfunc:aNiceInteger];

وأخيرا (هذا السؤال)، وليس الحصول على إجابة مرضية، لإعادة صياغة سؤالك الثالث، مع نجاح هذه المرة كما كان يحدث.

وأنا الغريب للحصول على عرض أكثر اكتمالا من المشروع الخاص بك من أجل أن أقدم لكم بعض النصائح. على أي حال، يبدو أن كنت تعلم المفاهيم الموضوعية-C وجوه المنحى: التهاني ودوافع البقاء

وأنت لم تعمل ما كائن البرمجة غير الموجه. مع [theObject method] يمكنك الاتصال فقط الأساليب التي تنتمي إلى حالة محددة.

وأنا لست متأكدا من أنه في أعقاب خدعة يعمل بشكل صحيح ل"العامة" الهدف-ج، ولكن في تنفيذ التفاح يمكنك أن تفعل هذا:

@interface SomeClass: NSObject {
  int m_someVariable;
  ...
};

- (NSString *) someMethod;
...
@end 

@implementation SomeClass
...
//pure c function with extra one parameter 
//for accessing to instance variables
static NSString privatePlainCeeMethod(SomeClass *my, int fortyTwo) {
  NSString *str;
  //access to a instance variable as for a usual
  //cee structure field: my->fieldName
  ...
  return [NSString stringWithFormat:@"someVariable:%d, fortyTwo:%d",
    my->m_someVariable, fortyTwo];
};

- (NSString *) someMethod  { 
  ...
  return privatePlainCeeMethod(self,42);
};
...
@end

وأنا استخدم هذه الحيلة لتقسيم طريقة objc كبير على وظائف بسيطة خاصة يمكن ملاحظتها. هذه الوظائف (أ) لا تلوث واجهة الطبقة و (ب) يتم استدعاء أسرع من الطريقة objc.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top