Objective C

لە چاوگ
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

ئەمە فێرکاریەکی سەرەتاییە و لە فێرکاریەکانی ئەپڵ بۆ پەرەپێدەرانی وەرگیراوە.

ئۆبجێکتیڤ سی (ئ.سی) زمانی سەرەکی نوسینی پرۆگرامە بۆ سیستمی OS X و iOS. بۆخۆشی گروپێکی گەورەترە لە زمانی پرۆگرامکردنی سی و توانای دابینکردنی پرۆگرامکردنی هەیە لەسەر شێوازی تەنخواز، Object Oriented. مەبەستمان لە وشەی تەنخواز بە کوردی ئەو شێوازی پرۆگرامکردنە کە پرۆگرامی نوسراو زۆرتر لە شت یان تەندا جۆر بکەین و بەکاریان بهێنین. ئەم فێرکاریە جێگای ڕوونکردنەوەی زیاتری تەنخوازی نیە.

ئۆبجێکتیڤ سی، دەق syntax، دراوە سەرەتاییەکان primitive datatypes و کۆنترۆڵی ئەنجامدانەکانی flow control زمانی سی وەرگرتوە و شێوازی دەق syntaxی پێناسەی پۆل class و functionکردارەکانی بۆ زیاد کراوە. هەروەها لە ئاستی زمانەکەشدا پشتیوانی لە ڕێکخستنی گراف زیادکراوە زۆرێک کرداری تر کە لە سیدا لە کاتی کۆمپایڵکردندا ئەنجام ئەدران پشتگوێخراوە بۆ کاتی خستنەگەڕ.

جۆرەکانی دراوە datatypes

پەڕگە فەرمیەکانی ئەپڵ دووپاتی ئەکاتەوە کەوا جۆرەکانی نرخی گۆڕاو، ئەوەی بە scalar variable type لە زمانی سی (سەیری فێرکاری سی لە زانستپەروەران بکە) لە ئ.سی'یشدا هەیە:

int someInteger = 42;
float someFloatingPointNumber = 3.1415;
double someDoublePrecisionFloatingPointNumber = 6.02214199e23;

ئەوەی لە ئ.سی'دا تایبەتە بەم جۆرە داتا سادانە، ئەوەیە کە لە کاتێکدا لە ناو ڕیز Array یان کۆمەڵە collectionێکدا بەکاریان بهێنین ناچار ئەبین بیانکەین بە تەن Object بۆیە بۆ هەریەک لەمانە جۆرێک پۆل هەن کە بتوانن ئەو جۆرە داتا سەرەتاییانە لەخۆیان بگرن. بۆ نمونە int ئەکرێ لەناو NSInteger و float و doubleیش لەناو NSNumberدا هەڵبگیرێن کە بە لە قاوغنانی داتا ئەکرێ ناو بهێنرێن یان بە ئینگلیزی data encapsulation. ئەم نمونانەی خوارەوە ببینە:

NSNumber *magicNumber = [[NSNumber alloc] initWithInt:42];
NSNumber *unsignedNumber = [[NSNumber alloc] initWithUnsignedInt:42u];
NSNumber *longNumber = [[NSNumber alloc] initWithLong:42l];
 
NSNumber *boolNumber = [[NSNumber alloc] initWithBOOL:YES];
 
NSNumber *simpleFloat = [NSNumber numberWithFloat:3.14f];
NSNumber *betterDouble = [NSNumber numberWithDouble:3.1415926535];
 
NSNumber *someChar = [NSNumber numberWithChar:'T'];

ئەگەر بە وردی سەیر بکەین هەموو نمونەکانی سەرەوە بە دامەزرێنەر initializerی وەک initWith دروستکراون کە دواتر باسیان ئەکەین. بەڵام ئەوەی گرنگە لە ئ.سیدا گرنگیەکی یەکجار زۆر بەم دامەزرێنەرانە ئەدرێت جا چ لەو جۆرە یان لە جۆری کارگەکەدا بن وەک لە کاتی دروستکردنی نوسە Stringدا:

NSString *firstString = [[NSString alloc] initWithCString:"Hello World!"
                                                 encoding:NSUTF8StringEncoding];
NSString *secondString = [NSString stringWithCString:"Hello World!"
                                            encoding:NSUTF8StringEncoding];
NSString *thirdString = @"Hello World!";

لەسەرەوە هەمان نوسە بە سێ شێوە دروستکران:١. بە دامەزرێنەری پۆلەکە ٢. کردارێکی کارگە یان ٣. شێوازی دەقی پرۆگرام خۆی.

پێناسەکردنی پۆل (class)

پێناسەی زمانەکە درێژتر و بابەتەکە یەکجار فراوانە. مەبەست لەم فێرکاریە نیشاندانی سەرەتای نوسینی پرۆگرامی سادەیە بۆیە ئەچینە سەر نمونە. پۆل classێک بەناوی SimpleClass لە ئ.سی بەم شێوەیە دروست ئەکرێت:

@interface SimpleClass : NSObject
 
@end

لە ئ.سی لەبەر ئەوەی زۆربەی بەشەکانی پرۆگرام جۆرێکن لە پۆل، بۆیە هەموو پۆلێکیش بۆخۆی سەربە پۆلی سەروو هەموانن کە پۆلی NSObject خۆیەتی. بۆیە لە پێناسەکەی سەرەوە SimpleClass : NSObject نوسراوە. پۆلەکەش بە زاراوەی interface بە پێشگری ئەت @ دروست ئەکرێ و بە زاراوەی endیش کۆتایی دێت.

لە هەموو شتێک گرنگترە وەک لە زمانی C++دا ئەکرێ هەموو پۆلێک لە دوو پەڕگەی جیاوازدا هەڵگرین کە یەکێکیان سەرپەڕ و ئەویتریش کۆدەکە لەخۆی ئەگرێ. بۆ نمونە پۆلی Person ئەکرێ لە دوو پەڕگەی Person.h و پەڕگەی Person.mدا هەڵبگیرین. لە سەرپەڕەدا پێناسە گشتیەکان و لە ناوپەڕەشدا تەواوی پرۆگرامەکە ئەنوسینەوە. دواتر ئەمە ڕوونتر ئەکەینەوە.

تایبەتمەندیەکان properties

گەر بڕیاربێ پۆلێک دروست بکەین پێناسەی مرۆڤ بکات، ئەوا پێویستمان بە دوو نوسە String ئەبێ کە پێناسەی ناو و نازناوی پێ بکەین، ئەوکاتە ئەکرێ تۆ تایبەتمەندی property بۆ پۆلەکەمان پێناسە بکەین بەم شێوەیە. هێمای * لە زمانەکانی سی و سی++دا بۆ "هێماکەر" pointer بەکاردێ کە دیسان جێگای ڕوونکردنەوە لەم فێرکاریەدا نابێتەوە.

@interface Person : NSObject

@property NSString *firstName;
@property NSString *lastName;

@end

لە دوو دەستەواژە زیادکراوەکەدا: زاراوەی property پێناسەکردنی field یان بوارێکە بۆ پۆلەکە لە زمانێکی وەک جاڤادا، لە سیدا دیسان بە تایبەتمەندی ئەناسرێت, NSStringیش بۆخۆی پۆلێکی تایبەتی زمانی ئ.سی بۆ هەڵگرتنی نوسە String و هێمانی * وەک وتمان هێماکەرە کە هەموو پۆلێک لە ئ.سی دا ئەبێ لەپێشی دانرێت و دواجاریش ناوی تایبەتمەندیەکە دێ کە firstName یان lastNameە. هەردوو ناوەکە بۆخۆی جۆرێک لە ستانداردی نوسینی پرۆگرامکردن لە ئ.سی دا نیشان ئەدەن کە عادەتەن گۆڕاو variable ئەبێ بە پیتی بچووک دەست پێ بکات و دوای تەواوبوونی وشەیەک وشەی دوەم پیتی یەکەمی گەورەبێت واتە first+Name بەو شێوەیە.

تایبەتمەندیەکی گرنگ کە لە ئ.سی'دا هەیە دیاری کردنی جۆری 'تایبەتمەندی'ەکانە. واتە چۆن ئەکرێ کەسێک ناوی خۆی نەکرێ بگۆڕدرێ، ئەکرێ دیاری بکرێ کە propertyیەک چ جۆرە گۆڕانێکی بەسەردا بێت، هەروەها لەبەر ئەوەی ئ.سی لەبواری مۆبایلدا بەکاردێ گرنگی یەکجار ئەدرێ بە جۆری بیرگە. لێرەشدا ئەکرێ دیاری بکرێ کە ئایا 'تەن'ێک کامە بەشی لە بیرگەدا بۆ چەندە بمێنێتەوە. با نمونەیەک باس کەین:

@interface Person : NSObject
@property (readonly) NSString *firstName;
@property (readonly) NSString *lastName;
@end

لێرەدا هەمان نمونەی سەرەوە، بەڵام دیاریمان کردوە کە ناو و نازناو نەگۆڕدرێ و تەنها بخوێنرێتەوە. جۆرەکانی تری تایبەتمەندێتی لەجێگای خۆی باس ئەکەین. لە ئێستادا گرنگە بزانین کە هەندێ لە جۆرەکانی داتای سەرەتایی وەک بوڵ BOOL تەنها دەستنیشان assign ئەکرێ چونکە تەن نین بەم شێوەیە:

@interface Person : NSObject
@property (readonly) NSString *firstName;
@property (readonly) NSString *lastName;
@property (assign) BOOL alive;
@end

بۆیە بە گشتی ئەم نمونەیەی خوارەوە کە لە ویکیپیدیا وەرگیراوە شایانی نوسینە لێرە تا جیاوازی ئ.سی لەگەڵ زمانەکانی تردا، بۆ نمونە س++، دەرکەوێت:

@interface classname : superclassname {
 // instance variables
}
+ classMethod1;
+ (return_type)classMethod2;
+ (return_type)classMethod3:(param1_type)param1_varName;
 
- (return_type)instanceMethod1With1Parameter:(param1_type)param1_varName;
- (return_type)instanceMethod2With2Parameters:(param1_type)param1_varName param2_callName:(param2_type)param2_varName;
@end

ئەمەش نمونەکە لە سی++

class classname : public superclassname {
 protected:
 // instance variables
 
 public:
 // Class (static) functions
 static void * classMethod1();
 static return_type classMethod2();
 static return_type classMethod3(param1_type param1_varName);
 
 // Instance (member) functions
 return_type instanceMethod1With1Parameter (param1_type param1_varName);
 return_type instanceMethod2With2Parameters (param1_type param1_varName, param2_type param2_varName=default);
};

کردار function

لە زمانی سی و زمانەکانی دیدا پێناسەکردنی کردارێک ئاسانە و بەم جۆرەیە:

void SomeFunction();

لە ئ.سی دا جیاواز لە زمانەکانی تر گرنگیەکی تایبەت بە کردار دراوە. لە ئ.سی دا هەمان کردار زۆر هاوشێوەیە و ئاوا پێناسە ئەکرێت:

- (void)someMethod;

لەم ناساندنە ئاسانەشدا تێبینی ئەکەین کە نیشانەی کەم/داش هەیە لەپێش کردارەکە کە بە کۆمپایڵەر (وەرگێڕ)ەکەمان ئەڵێ کە ئاگاداربە ئەمە کردارێکی نمونەیەکەی تەنە object instance method. ئیتر ئەوانی تری ئەبێ ئاشکرابێت لای فێرخواز. زاراوەی void لە زۆربەی زمانەکاندا بەهەمان شێوە بەکاردێ و مانای بەتاڵی هەیە.

لە ئ.سیدا شتێکی تایبەتی هەیە بە کردارەکان کە parameter نرخە دراوەکان لەناو پێناسەی کردارەکەدا جێگیر کراون. بۆ نمونە لە سیدا ئاوا ئەنوسین:

void SomeFunction(SomeType value);

بەڵام لە ئ.سیدا ئاوای لێدێ

- (void)someMethodWithValue:(SomeType)value;

جیاوازیەکە چیە؟ جوت خاڵەکە : وا ئەکات بتوانین زیاد لە پارامیتەرێک بخەینە ناو پێناسەی کردارەکەمانەوە و خوێنەرەوەی کۆدەکەش بزانێ کە کام نرخ بۆ چ مەبەستێک بەکاردێت. نمونەیەکی جوانتر ئاوایە

- (void)createPersonWithFirstName:(NSString*)fName andLastName:(NSString*)lName;

ئەم پێناسەی کردارەش بەم شێوەیە کورت ئەکرێتەوە و ئەناسرێت:

createPersonWithFirstName:andLastName:

بۆیە کاتێک ئەبینین پێناسەی کردارەکە بەو شێوەیەیە، ئیتر ڕێگا نادرێ پارامیتەرەکان پاش و پێش بکەون وەک لە زمانەکانی تردا ئەکرێت. هەر بۆیە لە ئ.سیدا ناوی نرخەکان تێکەڵ بەناوی کردارەکە خۆی کراوە لە کاتێکدا لە زمانێکی وەک سیدا ناوی نرخەکانەوە بەخۆیانەوەیە. ئەوەی سەرەوە بەم شێوەیە ئەنوسرێ لە سی'دا:

void assignNames( char* fName, char* lName);

بۆماوەیی inheritance

وەک هەموو زمانە تەنخوازەکانی تر، ئ.سی'یش پشتیوانی تەواو ئەکات لە بۆماوەیی پۆلەکان. وەک لەسەرەوە نیشاندرا پۆلی Person تەواوی تایبەتمەندی propteryیەکانی NSObject بۆماوەتەوە و هەر پۆلێکشی کە سەر بە کەس Personبێت بۆ نمونە Teacher ئەوا تایبەتمەندیەکانی Personی بۆ ئەمێنێتەوە. لە وێنەکەی خوارەوەدا نیشانی ئەدەین کە چۆن دوگمەیەکی سەر ئایفۆنەکەت بریتیە لە چەن بۆمانەوەیەک تا ئەگاتەوە سەر سەرپۆل NSObjectی زمانی ئ.سی:

وێنەیەکی نیشاندانی بۆمانەوە، پۆلێکی UIButton چۆن ئەگەڕێتەوە سەر سەرپۆلی NSObject

لە نمونەی پۆلی Personدا ئەگەر مامۆستا دروست بکەین، ئاوا بۆمانەوەکە نیشان ئەدەین:

#import "Person.h"

@interface Teacher : Person
 
@end

ئەوکات ئەبێ لەناو پێناسەکەدا دەستەواژەی import بەکار ئەهێنین نەک includeی زمانی سی، بۆ ئەوەی وەرگێڕ compiler ئاگادار بێت باسی کام پۆل ئەکەین. لە نمونەکەی پێشتردا بۆخۆی NSObject ناسراوە لە بنەڕەتدا بۆیە پێویستی بە ناساندن نیە.

دابینکردنی ناوەڕۆکی پۆل

وەک لەسەرەوە وتمان پۆلێکی ئاسایی لە دوو پەڕگەدا هەڵ ئەگیرێت. لێرەدا زیاتر لەسەر ناوەڕۆکی پۆل ئەدوێین class implementation کە لە .m پەڕەکەدایە. وەک لەسەروە وتمان پۆلێک لە پەڕەی .hدا ئەناسێنین و زاراوەی interface بەکاردێنین تا دەستنیشانی بکەین کە ئەوەی لەپەڕەی .h سەرپەڕەدا هەیە بەردەستە و ئەتوانرێ ببینرێ بەڵام .m بۆ نوسەری پرۆگرامە و شاراوەیە لە خەڵکی تر. بۆ نمونە پۆلی Personئەکرێ ئاوا دەوڵەمەنتر بکەین:

@interface Person : NSObject
@property (readonly) NSString *firstName;
@property (readonly) NSString *lastName;
@property (assign) BOOL alive;

- (void)sayHello;

@end

وەک دیارە یەک کردارمان بۆ زیادکرد بەناوی sayHello کە لە پەڕەی implementation دا ئەی ناسێنین

#import "Person.h"
 
@implementation Person
- (void)sayHello {
    NSLog(@"Hello, World!");
}
@end

ورد تەماشا بکە لە کۆتایی پێناسەی کرداری sayHelloدا جووتکەوانەمان نیە () وەک لە زمانەکانی دیکەدا هەیە. هەروەها لە کاتی پێناسەکردنەکەشدا بەدوای پێناسەی کردارەکەدا یەکسەر ناوەڕۆکی کۆدەکە هاتوە. لێرەدا NSLog جۆرێکی تایبەتی نوسینە لە consoleی تایبەت بە iOS و OSX.

سەرچاوەی زیاتر

(ئەم بابەتە لەژێر دەستکاری دایە)