অ্যাপলের নতুন ল্যাঙ্গুয়েজ হচ্ছে Swift. যা C এবং Objective-C এর উপর ভিত্তি করে ডেভেলপ করা হয়েছে। এবং সুইফট এ কোড করা C এবং Objective-C এর থেকে সহজ... সুইফট শিখতে হলে আমাদের অ্যাপলের নিজস্ব IDE Xcode লাগবে। আর Xcode এর জন্য লাগবে ম্যাক অপারেটিং সিস্টেম। অ্যাপলের ডেভেলপার সাইট থেকে Xcode ডাউনলোড করে ইন্সটল করে নিলে আমরা সুইফট প্রোগ্রামিং শুরু করতে পারি।
Xcode ওপেন করলে আমাদের অনেক গুলো অপশন দেখাবে। আমরা Get Started with Playground দিয়ে শুরু করব। Get Started with Playground এ ক্লিক করলে আমাদের নতুন একটা অপশন দেখাবে, প্লেগ্রাউন্ডের নাম পছন্দ করার জন্য। যে কোন একটা দিয়ে Next এ ক্লিক করব। এরপর কোথায় প্লেগ্রাউন্ডটি সেভ করব তা দেখিয়ে দিলেই প্লেগ্রাউন্ডে সুইফট কোড লেখার জন্য আমরা প্রস্তুত হয়ে যাবো। আমাদের ডিফল্ট ভাবে Hello World! প্রোগ্রামটি দেখাবে।
এই প্লে গ্রাউন্ডেই আমরা সুইফট প্রোগ্রামিং এর উপর আমাদের ব্যাসিক ক্লিয়ার করব। এরপর এই ব্যাসিক জ্ঞান কাজে লাগিয়ে কিভাবে iOS অথবা Mac OS X এর জন্য সফটোয়ার তৈরি করা যায়, তা পরে এ শিখে নিব।
আমরা যাই লিখব, আমাদের আউটপুট ডান পাশে দেখাবে। আমরা সাধারণত অন্যান্য প্রোগ্রামিং শেখার জন্য আগে কোড লিখি, তার তা রান করি। প্লেগ্রাউন্ডে লাইভ রান হবে। কোন কিছু ভুল করলে দেখাবে।
Hello World প্রোগ্রামে প্রথম লাইনটি একটি কমেন্ট। যাকে বলে Single Line Comment. যা ডাবল স্ল্যাস দিয়ে লেখা হয়। দ্বিতীয় লাইনে একটি লাইব্রেরি ইম্পোর্ট করা হয়েছে, UIKit, যেখানে সুইফট প্রোগ্রামিং এর স্টান্ডার্ড ইনপুট আউটপুটের প্রয়োজনীয় কোড লেখা রয়েছে। তৃতীয় লাইনে একটি ভ্যারিয়েবল ডিক্লেয়ার করা হয়েছে। সুইফট এ var দিয়ে কোন ভেরিয়েবল ডিফাইন করা হয়। এখানে ভেরিয়েবলটির নাম দেওয়া হছে str. এবং যার ভ্যালু, Hello World!
আমাদের কোন কিছু প্রিন্ট করতে হয়নি, ভ্যারিয়েবলের মান ডানপাশে দেখাচ্ছে। আমরা চাইলে প্রিন্ট করতে পারি, তার জন্য লিখতে হবেঃ
println("Hello World!")
আমরা ইচ্ছে করলে প্লেগ্রাউন্ডে থাকা সব কোড মুচে দিয়ে শুধু উপরের লাইনটি লিখতে পারি। তাহলেও আমাদের প্রোগ্রামটি আমাদের Hello World! আউটপুট দেখাবে। আমরা দেখতে পাচ্ছি আমাদের সেমিকোলন দিতে হয় না। হ্যা, সুইফটে প্রতিটি স্টেটম্যান্ট এর পরে সি / সি++ বা অবজেক্টিভ সি এর মত সেমিকোলন দিতে হয় না।
উপরের ছোট্ট লাইনে আমরা একটা String আউটপুট হিসেবে প্রিন্ট করিয়েছি। ইচ্ছে করলে আমাদের ডিফল্ট প্রোগ্রামটিতে যে ভ্যারিয়েবল ডিক্লেয়ার করেছি, তাও আমরা প্রিন্ট করতে পারি। যেমনঃ
// Playground - noun: a place where people can play import UIKit var str = "Hello, playground" println(str)
আমরা দেখে থাকব যে // Playground - noun: a place where people can play এবং import UIKit এ দুই লাইন ছাড়াও আমাদের কোড রান করবে। এরপরবর্তীতে আমরা ইচ্ছে করলে এ দুই লাইন না লিখেও কোড রান করাতে পারব।
এখানের যে কোন কোডই আমরা প্লেগ্রাউন্ডে লিখলে আমাদের রেজাল্ট দেখাবে। এবং নিজেয়া ইচ্ছে করলে নিজের মত করে কোড লিখতে পারব। বাড়তি কিছুই করতে হবে না। সিম্পল।
কনস্টেন্ট হচ্ছে যার মান পরিবর্তন হবে না। পুরো প্রগ্রামে মাত্র একবার মান সেট করব, কিন্তু অনেক বার ব্যবহার করতে হবে, তাই হচ্ছে কনস্টেন্ট। সুইফট এ কনস্টেন্ট ডিক্লেয়ার করা হয়ে let দিয়ে। যেমনঃ
let catName = "billy" let catAge = 2
এখানে আমরা দেখতে পাচ্ছি যে catName একটা স্টিং ভ্যালু। catAge হচ্ছে একটা ইন্টিজার। কিন্তু আমাদেরকে বলে দিতে হয় নি কোনটা ইন্টিজার, কোনটা স্টিং। সুইফট যথেষ্ঠ এডভান্স। যে বুঝতে পারে কোনটা কোন ধরনের কনস্টেন্ট। আবার আমরা ইচ্ছে করলে স্পস্ট ভাবে বলে দিতে পারি কোনটা কি ধরনের কন্সটেন্ট। যেমনঃ
let catName: String = "billy" let catAge: Int = 2
ভ্যারিয়েবল হচ্ছে যার মান প্রোগ্রামের যে কোন জায়গায় পরিবর্তন হতে পারে। ভ্যারিয়েবল ডিক্লেয়ার করা হয়ে var কীওয়ার্ড দিয়ে। যেমনঃ
var catName = "billy" var catAge = 2 var catWeight = 1.1
কন্সটেন্ট এর মত ভ্যারিয়েবলের টাইপ ও সুইফট নিজে নিজে বুঝে নিতে পারে। যেমন কোনটা কারেক্টার, কোনটা স্টিং, কোনটা ইন্টিজার, এসব বলে না দিলেও হয়। আমরা ইচ্ছে করলে বলেও দিতে পারিঃ
var catName: String = "billy" var catAge: Int = 2 var catWeight: Double = 1.1
Boolean:
শুধু মাত্র True / False ভ্যারিয়েবল ডিক্লেয়ার করার জন্য Boolean ব্যবহার করা হয়।
যেমনঃ
var isWinter = ture var sunnyDay = false
আমরা ইচ্ছে করলে স্পষ্ট করে বলে দিতে পারি যে এটা একটা boolean
var isWinter: Bool = ture var sunnyDay: Bool = false
যোগ, বিয়োগ, গুন, ভাগঃ
var x = 2 var y = 3 var addition = x + y var multiply = x*y var division = y/x
দুই টা ভ্যারিয়েবল যোগ, বিয়োগ, গুন ভাগ এসব করা সহজ। ভ্যারিয়েবল গুলোর মধ্যে প্রয়োজনীয় অপারেটত বসিয়ে দিলেই হবে। আচ্ছা, আমরা ইচ্ছে করলে একই টাইপের সব গুলো ভ্যারিয়েবল একই লাইনে লিখতে পারি। যেমনঃ
var x = 2 , y = 3 , z =3 var catName ="billy" , dogName = "puppy"
কিন্তু ভিন্ন ধরনের টাইপ একই সাথে আমরা লিখতে পারব না, নিচের মত করে লেখে দেখুন, ভুল দেখাবেঃ
var catAge = 2 , catName ="billy"
কারণ আমরা একই সাথে ইন্টিজার এবং স্টিং ডিক্লেয়ার করতে চেষ্টা করেছি।
Increment & Decrement অপারেটর
Increment এর কাজ হচ্ছে একটা ভ্যারিয়েবল এর মান এক করে বাড়ানো। Decrements অপারেটরের কাজ হচ্ছে এক করে কমানো। দুইটাই একই সাথে দেখি।
var x = 4 , y = 5 x++ y--
আবার
var x = 4 , y = 5 ++x --y
এই দুই অপারেটর আমরা ভ্যারিয়েবলের আগেও দিতে পারি, পরেও দিতে পারি। আগে দিলে মান এক বাড়বে বা কমবে এবং তাই আউটপুট দিবে। কিন্তু ভ্যারিয়েবলের পরে দিলে আগে ভ্যারিয়েবলের বর্তমান মান দেখাবে এবং পরে এক কমবে বা বাড়বে।
Comparison Operator:
দুইটা ভ্যারিয়েবল কম্পেয়ার করার জন্য Comparison Operator ব্যবহার করা হয়। কম্পেয়ার করার পর একটা Boolean মান রিটার্ন করে। True অথবা False. যেমনঃ
a == b a != b a < b a > b a <= b a >= b a === b a !== b
উপরের Comparison Operator গুলো দিয়ে একটি প্রোগ্রাম লেখার চেষ্টা করিঃ
var a = 2 , b = 8; if a < b { println( "a is less then b") }
এখানে a < b, a যদি b থেকে ছোট হয়, তাহলে এটা true হবে এবং ব্র্যাকেটের ভেতরের কোড গুলো এক্সিকিউট করবে। যদি false হয়, তাহলে ব্র্যাকেটের ভেতরের কোড গুলো এক্সিকিউট করবে না।
আমরা ইচ্ছে করলে println এর ভেতরে আমাদের ভ্যারিয়েবল প্রিন্ট করতে পারি। তার জন্যঃ
var a = 2 , b = 8; if a < b { println( "\(a) is less then \(b)") }
আচ্ছা, println এ স্ট্রিং এর সাথে একটি ভ্যারিয়েবল এর মান দেখানোর জন্য একটি ব্ল্যাক স্ল্যাস (\) লিখে এরপর ব্র্যাকেটের ভেতর ভ্যারিয়েবলটি লিখলে তা স্ট্রিং এর ভেতরে দেখাবে। যেমন উপরে আমরা \(a) এবং \(b) দিয়ে স্টিং এর ভেতর একটি ভ্যারিয়েবল এর মান দেখিয়েছি।
উপরের মত অন্যান্য যে কোন Comparison করে আমরা প্রোগ্রাম লিখতে পারি, যেমনঃ
var a = 2 , b = 8; if a > b { println( "\(a) is greater then \(b)") } else { println( "\(a) is less then \(b)") } if a==b { println( "\(a) is equal to \(b)") } else { println( "\(a) is not equal t \(b)") }
এভাবে অন্যান্য গুলো। আমরা লক্ষ করে থাকব যে অন্যান্য ল্যাঙ্গুয়েজ এর মত Comparison এর জন্য ব্র্যাকেট ব্যবহার করতে হয় না। আবার ব্যবহার করলেও ভুল হবে না। যেমনঃ
var a = 2 , b = 8; if (a != b) { println( "\(a) is not equal to \(b)") }
Logical Operators
তিন ধরনের লজিক্যাল অপারেটর রয়েছে। Logical AND, Logical OR, Logical NOT
Logical And তখনি সত্য হবে যখন এর প্রত্যেকটি Operand সত্য হবে। যেমনঃ
var a = 2 , b = 8; if (a != b) && (a < b) { println( "\(a) is not equal to \(b) and \(a) less then \(b)") }
এখানে (a != b) এবং (a < b) দুইটাই যদি সত্য হয়, তাহলে ব্র্যাকেটের ভেতরের কোড এক্সিকিউট করবে। Comparison করার সময় ব্র্যাকেট গুলো ব্যবহার না করলেও প্রোগ্রাম কাজ করবেঃ
var a = 2 , b = 8; if a != b && a < b { println( "\(a) is not equal to \(b) and \(a) less then \(b)") }
আবার একই সাথে দুই এর অধিক Comparison আমরা করতে পারি। যেমনঃ
var a = 2 , b = 8; if a != b && a < b && b > 5 { println( "\(a) is not equal to \(b) and \(a) less then \(b)") }
Logical And তখনি সত্য হবে যখন এর যে কোন একটি Operand সত্য হবে। যেমনঃ
var a = 2 , b = 8; if (a != b) || (a > b) { println( "it's a true comparison") }
উপরের comparison এর একটি সঠিক, আরেকটি ভুল, তারপর ও আমাদের if স্টেটমেন্ট এর ভেতরের কোড গুলো এক্সিকিউট হচ্ছে। OR অপারেটরেও আমরা একের অধিক Comparison করতে পারি।
Logical NOT অপারেটর একটি অপারেন্ড এর উপর কাজ করে। কাজ করার পর যদি Operand টি true হয়, তাকে false করে দেয়। যদি Operand টি false থাকে, তাকে true করে দেয়। যেমনঃ
var isWinter = ture if !isWinter { println("it's not winter") } else { println("it's winter") }
অ্যারে ভ্যারিয়েবল নিচে মত করে ডিক্লেয়ার করা হয়ঃ
var catNames = ["billy", "catty", "pitty" ]
অ্যারের এর ভেতরে উপাদান গুলো প্রিন্ট করার জন্য লিখবঃ
var catNames = ["billy", "catty", "pitty" ] println(catNames)
অ্যারে থেকে যে কোন একটা ইলিম্যান্ট এক্সেস করার জন্য লিখতে হয়ঃ
var catName = ["billy", "catty", "pitty" ] catNames[0] println(catName[0])
জেনে রাখা দরকার যে, ইন্ডেক্সিং শুরু হয় ০ থেকে। অর্থাৎ catName [0] তে থাকবে অ্যারের প্রথম ইলিম্যান্ট, এখানে যা হচ্ছে billy, দ্বিতীয় ইন্ডেক্স catName[1] থাকবে catty এভাবে বাকি গুলো।
অ্যারেতে নতুন একটি ইলিমেন্ট এড করার জন্য লিখবঃ
var catNames = ["billy", "catty", "pitty" ] catNames.append("buddy")
তাহলে নতুন একটি ইলিম্যান্ট যুক্ত হবে catNames এ। দুইটা অ্যারে আমরা ইচ্ছে করলে এক সাথ করতে পারি, তার জন্যঃ
var catNames = ["billy", "catty", "pitty"] var dogNames = ["puppy", "dolly", "tommy"] catNames += dogNames
অ্যারের যে কোন একটা ইলিম্যান্ট পরিবর্তন করতে চাইলেঃ
var catNames = ["billy", "catty", "pitty" ] catNames[0] = "newBilly"
অ্যারে থেকে একটা ইলিমেন্ট রিমুভ করার জন্যঃ
var catNames = ["billy", "catty", "pitty", "buddy" ] catNames.removeAtIndex(0) println(catNames)
Dictionary
Dictionary দারুন একটা কালেকশন টাইপ। অ্যারেতে একই টাইপের ডেটা রাখা যায়। কিন্তু ডিকশনারিতে ভিন্ন টাইপের ডাটা এক সাথে রাখা যায়। যেমন আমরা আমাদের বেড়ালের নাম এবং বয়স এক সাথে রাখতে চাচ্ছি, কিন্তু অ্যারেতে শুধু হয় আমর নাম গুলো এক সাথে রাখতে পারব, না হয় শুধু বয়স রাখতে পারব। কিন্তু ডিকশনারিতে ইচ্ছে করলে দুইটাই এক সাথে রাখতে পারব।
var catInfo = ["catty" : 2 , "billy": 1 , "putty": 3]
যেখানে আমরা এক সাথে স্টিং টাইপ এবং ইন্টিজার টাইপ ডেটা রেখেছি। কিন্তু আমাদের বলে দিতে হয় নি কোনটা ইন্টিজার, কোনটা স্টিং টাইপ। আমরা ইচ্ছে করলে স্পষ্ট ভাবে বলে দিতে পারি, কোনটা স্টিং ভ্যালু হবে কোনটা ইন্টিজার বা অন্য কোন টাইপের মান হবে।
var catInfo: Dictionary <String, Int> = ["catty" : 2 , "billy": 1 , "putty": 3]
স্ট্রিং এর আগে আমরা দেখেছি। কিভাবে একটি স্ট্রিং ভ্যারিয়েবল ডিক্লেয়ার করা হয়, কিভাবে প্রিন্ট করা হয়, আমরা এখন আরেকটু বিস্তারিত ভাবে জানব।
var str = "My String" println(str)
উপরের প্রোগ্রামে শুধু একটা String ভ্যারিয়েবল ডিক্লেয়ার করা হয়েছে এবং পরে তা প্রিন্ট করা হয়েছে।
আমাদের কাছে যদি একের অধিক স্ট্রিং থাকে, এবং আমরা তা এক সাথে যুক্ত করতে চাই, তাহলে লিখবঃ
var str1 = "Hello " var str2 = "World! " var fullText = str1 + str2 println(fullText)
দুইটা স্টিং এক সাথ করাকে বলা হয় Concatenation, উপরে আমরা তাই করেছি। দুইটা স্টিং জোড়া লাগানো সহজ, শুধু মাঝখানে + চিহ্ন যুক্ত করে দিলেই হয়। এভাবে আমরা একের অধিক স্টিং এক সাথ করতে পারি।
আবার আরো সহজেও করা যায়।
var str1 = "Hello " var str2 = "World! " str1 += str2 println(str1)
এখানে += ব্যবহার করে প্রথম স্ট্রিং এর সাথে দ্বিতীয় স্টিং যুক্ত করা হয়েছে। এবং পরে পুরো স্ট্রিং টা str1 এ এসাইন করা হয়েছে।
স্ট্রিং নিয়ে পরে আরো লেখার চেষ্টা করব...
একই কোড বার বার রান করার জন্য লুপিং ব্যবহার করা হয়। এগুলোর মধ্যে একটা হচ্ছে For Loop.
For Loop:
ফর লুপ অনেক ভাবেই লেখা যায়... for loop এর কয়েকটি অংশ রয়েছে, নিচের ছবিটি লক্ষ করিঃ
এ for loop এর তিনটি অংশ রয়েছে। তার আগে আমরা দেখেনি for loop সাধারন ব্যবহার নিয়ম।
for (exprission1; Exprission2;Expression3 ) { Statement }
এখানে প্রথম exprission1 হচ্ছে for loop এর প্রথম অংশ। এটি দ্বারা একটি নির্দিষ্ট বিষয়ের প্রাথমিক মান দেওয়া হয় । যাকে বলা হয় initial অংশ। এই বিষয়টিকে বলা হয় Index. এটি পুরো লুপিং প্রক্রিয়াকে নিয়ন্ত্রন করে। প্রাথমিক মানটি কোন কিছু যাছাই না করেই আউটপুট দেয়। মানে হচ্ছে প্রথমিক মান টা কোন কিছু যাচাই না করেই আউটপুট দিবে (যেমন প্রিন্ট বা অন্য কোন কাজে)।
দ্বিতীয় অংশটি অর্থাৎ Exprission2 দ্বারা একটি শর্ত দেওয়া হয়। লুপটি কতক্ষন পর্যন্ত চলবে তা এটি নির্নয় করে। Exprission2 তে সাধারনত একটি logical expression থাকে যা শুধু সত্য মিথ্যে বুঝতে পারে। যদি সত্য হয় তাহলে true রিটার্ন করে আর যদি মিথ্যে হয় তাহলে false রিটার্ন করে। এটি যদি false ছাড়া অন্য কোন মান রিটার্ন করে তাহলে লুপটি চলবে, আর যদি false রিটার্ন করে তাহলে লুপটি আর চলবে না।
Expression3 কাজ হচ্ছে আমারা প্রথমে যে প্রাথমিক মান নিলাম তাকে আমাদের ইচ্ছে মত মডিফাই করা। এটি প্রত্যেক লুপের শেষ ধাপে কাজ করে।
আর আগেই বলছি লুপটি ততক্ষনই চলবে যতক্ষন পর্যন্ত Exprission2 মিথ্যে বা false রিটার্ন না করে। এরপরের অংশ হচ্ছে Statement, লুপটি যার উপর কাজ করবে। সুইফট এ আমাদের for এর পর প্রথম ব্র্যাকেট না ব্যবহার করতে হয় না। আর করলেও প্রোগ্রামটি কোন ভুল দেখাবে না। নিচের উদাহরনটি দেখি।
for var x = 1; x < 100; x++ { println(x) }
উপরের প্রোগ্রামটিতে আমরা একটা ভ্যারিয়েবল নিয়েছি, x নামে। ইনিশিয়াল, এরপর লিখেছি x < 100 , যা দিয়ে প্রতিবার চেক করবে x এর মান কি ১০০ থেকে ছোট কিনা, যদি ছোট হয় তাহলে println(x) দিয়ে x এর মান প্রিন্ট করবে, এবং শেষে x++ দিয়ে x এর মান এক করে প্রতিবার বাড়িয়ে দেবে।
উপরের প্রোগ্রামটি লিখলে ডানপাশে কিছুই দেখাবে না। শুধু 4 items এমন একটা লেখা দেখাবে। আমরা লুপিং এর আউটপুট দেখতে চাইলে রাইট ক্লিক করে Open in Assistant Editor এ ক্লি করলে আমাদের লুপের আউটপুট দেখাবে। নিচের ছবিটির মত বা এমন কিছুঃ
আমরা ইচ্ছে করলে নিচের মত করেও for loop লিখতে পারি।
for index in 1...5 { println("This line will print 5 times") }
যে লুপ ব্যবহার করা আরো সহজ, এখানে 1...5 দিয়েই লুপটি কন্ট্রোল করা হয়, এক দিয়ে ইনিশিয়ালাইজ এর কাজ করা হয়েছে এবং ৫ দিয়ে কত বার পর্যন্ত লুপটি রান করবে তা বলে দেওয়া হয়েছে। আমরা ইচ্ছে করলে নিচের মত করও লিখতে পারিঃ
for index in 5...10 { println("This line will print 5 times") }
ইনিশিয়াল ভ্যালু এবং শেষ ভ্যালু যে কোন মানই আমরা দিতে পারি।
আমরা ইচ্ছে করলে একটা Array এর ভ্যালু এর উপর ও ইটারেশন চালাতে পারি এই for Loop দিয়ে:
var catName = ["billy", "catty", "pitty", "buddy"] for name in catName { println("Cat Name: \(name)") }
যেখানে name হচ্ছে যে কোন একটি ভ্যারিয়েবল নেইম, catName হচ্ছে আমাদের অ্যারে। অ্যারে এর প্রতিটা ইলিমেন্ট একটা একটা করে name এর মধ্যে এসাইন হবে, এবং for লুপের ভেতরের স্টেটমেন্ট এক্সিকিউট হবে। যখন দেখবে অ্যারের ভেতর আর কোন মান আর অবশিষ্ঠ নেই, তখন লুপিং শেষ হবে।
অন্যান্য লুপিং নিয়ে আরেকদিন লিখে পোস্টটি আপডেট করব 🙂
ফাংশান হচ্ছে পুনরায় ব্যবহার যোগ্য কোড ব্লক। যা একটি নির্দিষ্ট কাজ করতে পারে। সব গুলো ফাংশনের নিচে অংশ গুলো থাকেঃ
func hello() ->String{ return "Hello World!" } hello()
আমরা আগে সিম্পল একটা ফাংশন লিখিঃ
func hello() ->String{ return "Hello World!" } hello()
উপরে সিম্পল একটা ফাংশন লিখেছি আমরা, যার কোন প্যারামিটার নেই। যা একটি স্ট্রিং রিটার্ন করবে। পরে hello() দিয়ে ফাংশনটা কল করেছি। আরেকটু কমপ্লেক্স একটা ফাংশন লেখা যেতে পারে, যার একটি প্যারামিটার ও থাকবে।
func age (a: Int) -> String{ return "age is \(a)" } age(4)
যেখানে আমরা একটি ইন্টিজার প্যারামিটার হিসেবে নিয়েছি। এবং পরে একটা স্টিং রিটার্ন করেছি। আরেকটি ফাংশন লিখিঃ
func add(a: Int , b:Int) -> String{ var sum = a + b return "result is \(sum)" } add(4 , 6)
উপরের ফাংশনে আমরা দুইটা ইন্টিজার মান প্যারামিটার হিসেবে নিয়েছি। এবং পরে সে দুইটা ইন্টিজার যোগ করেছি। এবং যোগফল সহ একটি স্টিং আউটপুট হিসেবে রিটার্ন করেছি।
আজকের জন্য এতটুকু... আরেকদিন লিখব আশা করি... Closures Class, Enums, OOP in Swift ইত্যাদি নিয়ে। লিখব কিভাবে Swift ব্যবহার করে iOS অ্যাপ ডেভেলপ করা যায়, iOS অ্যাপ ডেভেলপের জন্য Swift এর পাশা পাশি আর কি কি জানা দরকার এসব নিয়ে 🙂 ধন্যবাদ সবাইকে। হ্যাপি কোডিং ...
আমি জাকির হোসাইন। বিশ্বের সর্ববৃহৎ বিজ্ঞান ও প্রযুক্তির সৌশল নেটওয়ার্ক - টেকটিউনস এ আমি 14 বছর 8 মাস যাবৎ যুক্ত আছি। টেকটিউনস আমি এ পর্যন্ত 224 টি টিউন ও 1487 টি টিউমেন্ট করেছি। টেকটিউনসে আমার 5 ফলোয়ার আছে এবং আমি টেকটিউনসে 0 টিউনারকে ফলো করি।
পৃথিবীতে অল্পকয়েক দিনের জন্য অনেকেই আসে, হেঁটে খেলে চলে যায়। এর মধ্যে অল্প কয়েক জনই পায়ের চাপ রেখে যায়।ওদের একজন হতে ইচ্ছে করে। প্রযুক্তির আরেকটি সেরা ব্লগ টেকটুইটস। আপনাদের স্বাগতম, যেখানে প্রতিটি বন্ধুর অংশ গ্রহনে গড়ে উঠেছে একটি পরিবার। আপনাদের পছন্দ হবে আশা করি। ফেসবুকে আমি - ?জাকির!
জাকির ভাই কে অনেক দিন পর টিটি পেয়ে ভাল লাগছে।