Objective-C Bangla Tutorial to develop iOS app – অবজেকটিভ সি বাংলা টিউটোরিয়াল

objective c part one blog featured image

যারা iOS app ডেভলপমেন্ট করতে চান, অন্য কোন ল্যাঙ্গুয়েজে কাজ করে অভ্যস্ত এবং দ্রুত অবজেকটিভ সি আয়ত্ব করতে চান তাদের জন্য এই ডকুমেন্ট

কোন প্রোগ্রামিং ল্যাঙ্গুয়েজ জানা থাকতে হবে কারন টিউটোরিয়াল লেখার সময় ধরেই নেয়া হয়েছে আপনি কোন প্রোগ্রামিং ল্যাঙ্গুংয়জ জানেন, আগে কোন ল্যাঙ্গুলেয় না জানা থাকলে এই ডকুমেন্ট দুর্বোধ্য মনে হতে পারে।

ফোকাস করা হয়েছে অবজেকটিভ সি এর নিজস্ব বিষয়গুলোতে যেন ডেভলপার খুব দ্রুত শিখতে পারেন।

Hello World in Objective-C

সাধারণ স্ট্রাকচার:

#import <Foundation/Foundation.h> // এটা হলো ফাউন্ডেশন ফ্রেমওয়ার্ক ইম্পোর্ট করা, Foundation ফোল্ডারে Foundation.h নামে একটি হেডার ফাইল আছে সেটাকে ইম্পোর্ট করা হলো।
int main(int argc, const char * argv[]){ // এটা মেইন মেথড, প্রোগ্রাম এক্সিকিউশন এখান থেকে শুরু হয়।
 @autoreleasepool{ // মেথড কিছু রিটার্ন করলে মেথডের অবজেক্টগুলো অটোমেটিক খালি(nil) করে দেয়। এই  autoreleasepool ব্লকের ভিতরে উদাহরণের কোড গুলো লিখব।
  NSLog(“Hello world”); // কনসোলে কিছু প্রিন্ট করে দেখতে। জাভার println() এর মত
  }
  return 0;
}

LOG:

কোন কিছু কনসোলে প্রিন্ট করে দেখতে NSLog ব্যবহার করা হয়। এখানে NS এসেছে Next Step থেকে, আর NeXTSTEP হলো এ্যাপলের অনেক পুরাতন একটি অপারেটিং সিস্টেম।

উদা:

NSLog(@”Hello world”);

কোন টেক্সট লেখা বা স্ট্রিং লিখতে হলে @ লিখে “ডাবল কোটেশনের” ভিতরে লিখতে হবে। এখানে @ চিহ্নটি কম্পাইলার ইন্ডিকেটর। এতে কম্পাইলার বুঝতে পারে যে এটা অবজেকটিভ সি এর স্ট্রিং।

Concatenation of string:

উদা:

int appleAmount = 4;
int penAmount = 3;
NSLog(@”There are %i apples and %i pens”, appleAmount, penAmount);

প্রথম লাইনে- appleAmount নামে একটি ভেরিয়েবল নেয়া হয়েছে যার ভেলু 4 এসাইন করা হয়েছে।

তৃতীয় লাইনে- কোন লেখার মাঝে বা শেষে অন্য লেখা যোগ করতে হলে প্লেস হোল্ডার ইন্ডিকেটর(%i) দিতে হবে।

উদাহরণে int এর জন্য %i ব্যবহার হয়েছে। এভাবে

ফ্লোটিং পয়েন্ট float এ %f

সিঙ্গেল কারেক্টার char এ %c

একাধিক লেখা যোগ করতে ধারাবাহিকভাবে পর পর ভেরিয়েবল গুলা কমা কমা দিয়ে লিখতে হবে। উদাহরণে লগ লাইনে, প্রথম ভেরিয়েবলের( appleAmount) ডাটা প্রথম %i কে ইন্ডিকেট করবে।

আউটপুট হবে : There are 4 apples and 3 pens

If else-

int numOfSomething = 8;
if(numOfSomething > 5){
 NSLog(@”It is too much”);
} else{
 NSLog(@”It is not too much”);
}

সাধারন if স্টেটমেন্ট । অন্যান্য লেঙ্গুয়েজের মতই if এ ==, <> || && এগুলো ব্যবহার করা যায়। comparison operator পরে দেখানো হয়েছে।

Switch case default:

উদা:

int amount = 3;
switch (amount){
 case 1:
  NSLog(@”This is one”);
  Break;
 case 2: // no break used so that if amount is 2 then case 3 will also execute
 case 3:
  NSLog(@”This is three”);
  Break;
 default:
  NSLog(@”This is out of range”);
  Break;
}

এখানে কোন বিশেষ কিছু নাই। এটা অন্যান্য ল্যাঙ্গুয়েজের মতই।

Operators and Expressions:

Arithmetic operators are + – * /

উদা:

int a = 33;
int b = a +7;
b += 8;

Operator precedence (কোন অপারেটরের কাজ আগে হবে):

উদা:

result = 2 + 3 * 10; // এখানে ১০ এর সাথে ৩ গুন হবে আগে তারপর ২ যোগ হবে।
result = (2 + 3) * 10; // এখানে আগে ২ এর সাথে ৩ যোগ হবে তারপর ১০ গুন হবে।

Equality and comparison:

উদা:

if( a == b){
}

এখানে == এর যায়গার দরকার মত এগুলো ব্যবহার করা যায়: (!= , >, <, >=, <=)

Logical and / or:

if( a==b && e==f ){
}
if( a==b || e==f ){
}

টিপস: এখানে এন্ড বা অর এর ক্ষেত্রে বাড়তি ( ) ব্যবহার করা যায় বুঝার সুবিধার জন্য।

if( (a==b) || (e==f) ){
}

Modulus:

int a = 4;

int remainder = a % 2; // result will be 0

Increment and decrement:

a++

a–

অথবা

++a

–a

এখানে a++ হলো  a = a+1;

আর a– হলো a = a-1;

যদি ++ বা — ভ্যারিয়েবলের আগে দেয়া হয় তবে অই লাইন এক্সিকিউশনের সময়ই ভ্যারিয়েবলের সাথে ১ যোগ হবে আর পরে দেয়া হলে অই লাইন এক্সিকিউশনের পর ভেরিয়েবলের সাথে ১ যোগ হবে।

Ternary :

int c = 6;

int d = 7;

int a = (c > d)? c: d;

এটা if else এর সংক্ষিপ্ত রুপ।

এটাকে এভাবে লেখা যায় –

if (c > d){
 a = c;
}else{
  A = d;
}

Loop:

int  a;
for (int a = 0; a < 10; a++){
 NSLog(@”The value is %i”, a);
}
//------------------------------------------
while ( a < 10 ){
 NSLog(@”The value is %i”, a);
 a++;
}
//------------------------------------------
do{
 NSLog(@”The value is %i”, a);
a++;
}while( a < 10 );

লুপের মাঝে break এবং continue ব্যবহার করা যায় অন্য ল্যাঙ্গুয়েজের মতই।

Function:

int makeSum(int a, int b){
 return a+b;
}

এটা সাধারণ ফাংশন। অবজেকটিভ সি তে ফাংশন লিখতে হবে সেই মেথড কল করার আগে। যদি মেইন মেথডে ফাংশান কল করা হয় তবে মেইন মেথডের আগে লিখতে হবে।

মেথড কল করার পরে ফাংশান লিখতে হলে প্রটোটাইপ (Prototype)  বলে দিতে হয় আগে। এখানে প্রটোটাইপ হলো ফাংশানের বডি ছাড়া বাকি অংশটুকু।

উদা:

#import <Foundation/Foundation.h>
int makeSum(int a, int b); // এটা প্রটোটাইপ
int main(int argc, const char * argv[]){
 @autoreleasepool{
  int r = makeSum(5, 6); // এখানে মেথড কল করা হলো
}
}
int makeSum(int a, int b){ // মেথড
 return a+b;
}

Data type:

ভেরিয়েবলের নাম কেস সেনসিটিভ, শুরুতে নিউমেরিক থাকা যাবে না। আন্ডারস্কোর ব্যবহার করা রিকমেন্ডেড না কিন্তু ব্যবহার করা যায়।

Premitive data types are:

int

float

double

char

BOOL

Composite data types are:

NSDate *today = [NSDate date]; // এখানে অনেক int নিয়ে এই NSDate

NSString *myString = @”Touhid Apps!”; // অনেক char নিয়ে NSString

Numeric :

int এটার range  -2,147,483,648 থেকে +2,147,483,648

unsigned int এটা 0 থেকে +4,294,967,295

long int এর range 32 bit এ শুধু int এর মতই, 64 bit এ -9223372036854775808 থেকে +9223372036854775808

long long int এ ৩২ এবং ৬৪ বিট দুইটাতেই -9223372036854775808 থেকে +9223372036854775808

লেখার ক্ষেত্রে একটি বিষয় – আগের লাইনে modifier ব্যবহার করা হলে পরের লাইনে টাইপ না বলে শুধু modifier ব্যবহার করলে আগের লাইনের টাইপ ধরে নেয়।

উদা:

unsigned int a = 45464;

unsigned b= 666666; //এখানের ডাটা টাইপ int

প্লেস হোল্ডার ইন্ডিকেটর(%i):

long long int এর জন্য %lli

unsigned int এর জন্য %u

//—————————————————

short int এর রেন্জ -32767 থেকে +32767

int এর ভিতর দশমিক কোন সংখ্যা রাখা যাবে না। রাখলে দশমিকের পরের অংশটুকু থাকবে না।

ফলাফল ভুল আসবে। এজন্য float অথবা double ব্যবহার করতে হবে।

float হলো 4 bit

double হলো 8(Eight) bit

উদা:

float a = 5.8f; // float এর ক্ষেত্রে শেষে f লিখাটা বেস্ট প্রেক্টিস

double b = 7.2;

ফ্লোটিং এর প্লেস হোল্ডার ইন্ডিকেটর তিন রকম করে করা যায়। (%f, %e, %g)

%e সায়েন্টিফিক নোটেশন সহ দেখায় তাই এটা সবচেয়ে নিখুঁত

%g টা ভ্যারিয়েবল অনুসারে একটা মান দেখায়

উদা:

float a = 33.3f;

এই a কে (%f, %e, %g) এই তিন রকমের প্লেস হোল্ডারে প্রিন্ট করলে তিন রকম ফল আসবে।

float a = 33.3f;

এবং

double b = 33.3;

কম্পিউটারের ডাটা স্টোর করার পদ্ধতির কারণে এই দুইটাকে %f দিয়ে প্রিন্ট করলে দুই রকম ফল আসবে।

Char:

char oneLetter = ‘T’;

প্রিন্ট করতে %c

BOOL:

অবজেকটিভ সি তে boolean কে BOOL এবং তার ভেলু true/false না হয়ে YES/NO এভাবে লেখা হয়।

BOOl isGood = YES;

BOOL isOn = NO;

প্রিন্ট করে দেখতে %i ব্যবহার করতে হবে। আর প্রিন্ট হবে YES এর জন্য 1 এবং NO এর জন্য 0

Scope:

Scope দুই রকম। Local এবং Global

কোন মেথড অথবা লুপের ভিতরে ভেরিয়েবল ডিক্লেয়ার করলে তা অই ফাংশান কিংবা লুপের ভিতরেই এক্সেস করা যাবে, বাইরে থেকে করা যাবে না। এটা হলো লোকাল স্কোপ।

যদি #import সেকশনের পরেই কোন ভেরিয়েবল ডিক্লেয়ার করা হয় তবে তা যে কোন মেথডের কিংবা লুপের ভিতর থেকে ধরা যাবে। এটা হলো Global scope ।

Enum:

যদি এমন হয় যে ই কর্মাসের জন্য প্রোগ্রাম লিখছেন, এখন একটি শার্টের তিন রকম সাইজ আছে – small, middle, large

এই তিনটি কে কাজে লাগানোর জন্য 1 হলে small, 2 হলে middle, 3 হলে large এভাবে ধরে কোডে ব্যবহার করা যায় কিন্তু এটা কোডিং এর ক্ষেত্রে সহজ বোধ্য না আবার মনে নাও থাকতে পারে কোনটাকে কি ধরা হয়েছিল আর যদি এটা কয়েকশো রকম হয় তাহলে তো আরো জটিল হয়ে যায় বিষয়টা। এক্ষেত্রে enum ব্যবহার করে বিষয়টাকে সহজবোধ্য করা যায়।

উদা:

enum shartSizes{
 small,
 middle,
 large
}
int main(int argc, const char * argv[]){
 enum shartSizes selectedShirt = middle;

 if( selectedShirt == large){
  // do something
}
}

উদাহরণ অনুসারে – shartSizes এ যে তিনটা সাইজ রাখা হয়েছে সেগুলো ডিফল্টভাবে 0, 1, 2 এভাবে ইনডেক্সিং থাকবে। এক্ষেত্রে selectedShirt হলো ভ্যারিয়েবল আর shartSizes হলো ডেটা টাইপ।

ইচ্ছা করলে এগুলোকে কাস্টম ভ্যালু দিয়ে এ্যাসাইন করে রাখা যায়।

enum shartSizes{
 small = 4,
 middle = 5,
 large = 6
}

যেহেতু ইনাম ব্যবহার করতে সরাসরি এগুলোর ভ্যালু ব্যবহার করা হবে না তাই ভ্যালু ইচ্ছা মত দেয়া যায় অথবা না দিলেও চলে, কম্পাইলার ভ্যালু বসিয়ে নেয়।

String:

NSString *name = @”Touhid apps!”;

অবজেকটিভ সি তে String নামে কোন ডেটা টাইপ নেই। স্ট্রিং এর জন্য ব্যবহার করতে হবে NSString. এটা ফাউন্ডেশন ফ্রেমওর্য়াকের অংশ। এটার নামের সাথে পয়েন্টার ব্যবহার করতে হয় এস্টারিক চিহ্ন ব্যবহার করে। এটা ভেরিয়েবলের নামের অংশ নয়। ডিক্লেয়ার করার সময়ই শুধু পয়েন্টারের চিহ্ন দিতে হবে। পরে ব্যবহারের সময় লাগবে না। ভ্যালু লেখার সময় আগে @ দিয়ে ডাবল কোটেশনের ভিতরে লিখতে হবে। এক্ষেত্রে প্লেস হোল্ডার ইন্ডিকেটর হলো %@

অবজেকটিভ সি তে সকল অবজেক্ট হলো পয়েন্টার টাইপ।

অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং (OOP)

Class & Object:

Class: ক্লাস হলো অবজেক্টের ব্লু প্রিন্ট (Blue print) . অবজেক্ট কি কি নিয়ে গঠিত হবে তা থাকে এই ক্লাসে। ক্লাসের কিছু উপাদান থাকে আর থাকে কাজ। মনে করি গাড়ি একটি ক্লাস আর এর উপাদান হলো চাকা, ইঞ্জিন, রং এবং কাজ হলো গাড়ির ইঞ্জিন স্টার্ট হয়, হর্ণ বাজে,  ব্রেক করা যায় । কোড চিন্তা করলে- উপাদানগুলোকে ক্লাসে ভেরিয়েবল আকারে আর কাজ গুলোকে মেথড আকারে রাখা যায়।

এভাবেও চিন্তা করা যায়: ক্লাস হলো একটি ফাইল যা যাতে ভেরিয়েবল আর মেথড থাকে। এই ক্লাসকে আমরা অবজেক্ট হিসেবে ডিক্লেয়ার করতে পারি যতবার খুশি তত বার। যখন প্রোগ্রাম রান করা হয় তখন ডিক্লেয়ার করা অবজেক্ট গুলো একই ক্লাসের অনুসারে গঠিত হয়। যেমন: গাড়ির অবজেক্টগুলো রান করালে প্রয়োজন মত এক এক সময় এক এক রঙের এক এক রকম চাকার গাড়ির অবজেক্ট তৈরি হবে। অবজেক্ট হলো ক্লাসের instance ;

উদা:

NSString *name = @”Touhid”;
NSString *phone = @”iPhone”;

এখানে NSString হলো ক্লাস আর Touhid হলো অবজেক্ট এবং name হলো অবজেক্টের রেফারেন্স। এভাবে ইচ্ছা মত একই ক্লাস থেকে একাধিক অবজেক্ট তৈরি করা যায়। এখানে name এবং phone এই দুটি অবজেক্ট তৈরি করা হয়েছে একটি ক্লাস(NSString) থেকে।

* এই এস্টারিক চিহ্নটি পয়েন্টার বুঝানো হয়।

Pointers:

অবজেক্টিভ সি তে সকল অবজেক্টে এক্সেস করা হয় পয়েন্টারের মাধ্যমে।

আমরা যদি লিখি int amunt = 786;

এখানে পয়েন্টার নেই, এখানে int হলো প্রিমিটিভ টাইপ এর জন্য মেমোরিতে 4 বাইট যায়গা লাগে। যখন আমরা int ডেটা নেই তখন এটা মেমোরিতে 4 বাইটের একটা যায়গা দখল করে রাখে। এই যায়গায় 4 বাইটের যে কোন ডেটা রাখা যায়। এটা নির্দিষ্ট পরিমান যায়গা দখল করে। এখানে রাখা হয়েছে 786, এই সংখ্যার সাথে কিছু যোগ বিয়োগ গুন ভাগ যাই করা হোক, 4 বাইট যায়গার মধেই সব হবে। কিন্তু একটা অবজেক্ট কত বড় হবে তা নির্দিষ্ট নয়।

NSString *something = @”Hello how are you?”;

এখানে লেখা কত বড় হবে এবং তা কত যায়গা দখল করবে তা আগেই বলা যায় না। এখানে পয়েন্টারের মাধ্যমে অবজেক্টের মেমোরির এড্রেস রাখা হয়। জাভাতেও একই কাজ করা হয় শুধু পয়েন্টারের এস্টারিক চিহ্ন হাইড করা থাকে।

অবজেকটিভ সি তে কোন অবজেক্ট লিখতে হলে এই এস্টারিক দিতে হবে কিন্তু ব্যবহারের সময় এস্টারিক লাগবে না। এস্টারিক নামের অংশ নয়।

NSString *something;
something  = @”Hello how are you?”;

 পরে ব্যবহারের সময় এস্টারিক দেয়া যাবে না।

Methods:

অবজেকটিভ সি তে মেথড কল করার পদ্ধতি অনেকটা ভিন্ন। জাভাতে অবজেক্ট এর পর ডট দিয়ে মেথড কল করা যায় কিন্তু অবজেকটিভ সি তে স্কয়ার ব্রাকেট দিয়ে অবজেক্ট লিখে একটা স্পেস দিয়ে মেথডের নাম দিতে হয় , মেথডের পর প্যারেন্থেসিস( ) দিতে হয় না।

উদা:

জাভাতে: myObject.myMethod();

অবজেকটিভ সি তে: [myObject myMethod];

মেথড কোন কিছু রিটার্ন করলে এভাবে:

জাভাতে: String name = myObject.myMethod();

অবজেকটিভ সি তে: NSString *name = [myObject myMethod];

আর্গুমেন্ট থাকলে:

জাভাতে: String name = myObject.myMethod(arg);

অবজেকটিভ সি তে: NSString *name = [myObject myMethod:arg];

একাধিক আর্গুমেন্ট থাকলে:

জাভাতে: String name = myObject.myMethod(arg, arg2);

অবজেকটিভ সি তে: NSString *name = [myObject myMethod:arg another:arg2];

যখন মেথড তৈরি করব তখন মেথডের নামের আগে যদি + চিহ্ন দেই তার মানে এটা ক্লাস মেথড অর্থাৎ জাভাতে যেমন মেথডকে static করলে সরাসরি ক্লাস থেকে কল করা যায় তেমন করে ক্লাস থেকে কল করা যায়। যদি – চিহ্ন দেই তাহলে তা হবে ইনস্টেন্স মেথড অর্থাৎ ক্লাস থেকে অবজেক্ট তৈরি করে তারপর কল করতে হবে।

  •  
  •  
  •  
  •  
  •  

Leave a Reply

Your email address will not be published. Required fields are marked *