৩-২ঃ সুইফ্ট ল্যাঙ্গুয়েজে স্ট্রিং ও ক্যারেকটার টাইপ ভ্যারিয়েবল

Standard

এই সিরিজের পুরো পোস্ট লিস্ট এবং সম্ভাব্য কাগুজে বই এর সূচি দেখতে ক্লিক করুনbangla-ios-objective-c-swift-nuhil

আগের চ্যাপ্টারঃ সুইফ্ট (Swift) – অ্যাপলের নতুন চমক (পরিচিতি ও অন্যান্য বেসিক)

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

ক্যারেকটার ও স্ট্রিং ঃ
অন্যান্য বেসিক ডাটাটাইপ (Integer, Float, Double) গুলোর মতই ক্যারেকটার (Character) একটি ডাটাটাইপ যা এক বাইট (Byte) ডাটা সংরক্ষন করে। অন্যদিকে ক্যারেকটার টাইপ অ্যারে কে স্ট্রিং(String) বলা হয়। অর্থাৎ যদি একাধিক ক্যারেকটার একত্রে কোন নির্দিষ্ট নিয়মে সাজানো হয় তাহলে এই ক্যারেকটারগুলোকে একত্রে একটি স্ট্রিং বলা হয়। যেমন ঃ “Steve Jobs”, “Swift”, “Programming”, “Macbook Pro and My IPhone” ইত্যাদি। অনেকসময় একটি ক্যারেকটার কে ও স্ট্রিং হিসেবে ব্যবহার করা যায় যার উদাহরন আমরা একটু পরেই দেখব।

অন্যান্য প্রোগ্রামিং ল্যাঙ্গুয়েজের চেয়ে সুইফ্ট এ স্ট্রিং ও ক্যারেকটার ম্যানিপুলেট করা অনেক বেশী ফাস্টার এবং সুইফ্ট ক্যারেকটার গুলোতে ইউনিকোড ক্যারেকটার স্টোর করে। অর্থাৎ যেকোন ক্যারেকটারে ভ্যালু হিসেবে ইউনিকোড স্টোর করা যায় যা এনকোডিং ডিকোডিং এর ঝামেলা কমিয়ে দিয়েছে। এছাড়া সুইফ্ট ল্যাঙ্গুয়েজে স্ট্রিং ম্যানিপুলেশন খুবই সহজ। খুব সহজেই যেকোন স্ট্রিং এর কোন ইনডেক্সে কনস্ট্যান্ট, ক্যারেকটার, নাম্বার, এক্সপ্রেশন ইত্যাদি ইনসার্ট করা যায়। এভাবে স্ট্রিং এর মধ্যে কোন কিছু ইনসার্ট করাকে ইন্টারপুলেশন বলা হয়।

স্ট্রিং ডিক্লেয়ার করাঃ
কিভাবে ভ্যারিয়েবল ও কনস্ট্যান্ট ডিক্লেয়ার করতে হয় তা আমরা প্রথম অধ্যায়ে শিখেছি। একই ভাবে স্ট্রিং টাইপ ভ্যারিয়েবল বা কনস্ট্যান্ট ডিক্লেয়ার করতে হয়।

let stringVariable = "যেকোন ইউনিকোড সাপোর্টেড ক্যারেকটারসমুহ"
let anotherStringVariable: String = "Yosemite is the name of latest OS X"

যেহেতু stringVariable ও anotherStringVariable দুটিতে স্ট্রিং দিয়ে ইনিশিয়ালাইজ করা হয়েছে তাই এই কনস্ট্যান্ট দুটি এখন স্ট্রিং টাইপ কনস্ট্যান্ট হিসেবে কাজ করবে। এবং এদের উপর যাবতীয় স্ট্রিং অপারেশনগুলো করা যাবে।

স্ট্রিং এ ক্যারেকটার ছাড়াও অন্যান্য যা যা থাকতে পারে ঃ

  • সব ধরনের স্পেশাল (escaped special) ক্যারেকটার যেমন ঃ \০ ( null ), \n (new line), \\ (backslash), \t (horizontal tab), \” (double quote), \’ (single quote) ইত্যাদি।
  • এক বাইটের ইউনিকোড স্কেলার (\xnn, nn এর জায়গায় যেকোন দুটি হেক্সাডেসিমেল ডিজিট বসতে পারে)
  • দুই বাইটের ইউনিকোড স্কেলার (\xnnnn, nnnn এর জায়গায় যেকোন চারটি হেক্সাডেসিমেল ডিজিট বসতে পারে)
  • চার বাইটের ইউনিকোড স্কেলার (\xnnnnnnnn, nnnnnnnn এর জায়গায় যেকোন আটটি হেক্সাডেসিমেল ডিজিট বসতে পারে)

এই চারধরনের বিশেষ ক্যারেকটার গুলো নিয়ে নিচে চারটি উদাহরন দেওয়া হলঃ

let wiseWords = "\"Imagination is more important than knowledge\" - Einstein"
// "Imagination is more important than knowledge" - Einstein
let dollarSign = "\x24"        // $,  Two Byte Unicode scalar U+0024
let blackHeart = "\u2665"      // ♥,  Four Byte Unicode scalar U+2665
let sparklingHeart = "\U0001F496"  // 💖, Eight Byte Unicode scalar U+1F496

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

var ফাঁকাস্ট্রিং = ""               // empty string literal
var emptyString = ""
var anotherEmptyString = String()  // initialiser syntax
// these three strings are all empty, and are equivalent to each other

প্রয়োজনে খুব সহজেই isEmpty প্রোপার্টির বুলিয়ান ভ্যালু দেখে কোন স্ট্রিং ফাঁকা কিনা তা চেক করা যায়।

var emptyString = ""
if emptyString.isEmpty {
    println("Nothing to see here")
}
// prints "Nothing to see here"

স্ট্রিং মিউট্যাবিলিটি (String Mutability) ঃ
কোন স্ট্রিং মিউট্যাবল( Mutable or Modifiable) হবে কিনা তা নির্ধারিত হয় ভ্যারিয়েবল বা কনস্ট্যান্ট ডিক্লেয়ার করার সময়। যদি স্ট্রিংটি “var” টাইপ দিয়ে ডিক্লেয়ার করা হয় তাহলে এটিকে মডিফাই করা যাবে। কিন্তু যদি এই স্ট্রিংটি “let” টাইপ হয় তাহলে এটি একটি কনস্ট্যান্ট এর ন্যায় আচরন করবে। তাই “let” টাইপ স্ট্রিং মিউট্যাবল না। নিচের উদাহরন টি দেখলেই পরিস্কার হয়ে যাবে ব্যাপার টি।

var variableString = "Swift is"
variableString += " a new programming language."
// variableString is now "Swift is a new programming language."
 
let constantString = "Swift is very much"
constantString += " faster and interactive"
// this reports a compile-time error - a constant string cannot be modified

নোটঃ
সুইফ্ট (Swift) এর এই স্ট্রিং এর সাথে অবজেকটিভ-সি (Objective-C) এর NSString রয়েছে ব্রিজ কানেকশন। আমরা যদি Cocoa অথবা Cocoa Touch এর Foundation ক্লাস নিয়ে কাজ করি তাহলে সুইফ্ট এর স্ট্রিং টাইপ ভ্যারিয়েবলগুলোর জন্য NSString ক্লাসের সব এপিআই (API) কল করা যায়।

Cocoa বা Cocoa Touch এর Foundation ক্লাসের NSString এর ইনস্ট্যান্স তৈরী করে যদি ফাংশন বা মেথডে পাঠানো হয় তাহলে মুলত ওই স্ট্রিং এর রেফারেন্স বা পয়েন্টারকেই পাঠানো হয় যা নতুন পয়েন্টার বা রেফারেন্সে অ্যাসাইন করা হয়। আসল স্ট্রিং এর কোন কপি তৈরী হয় না। অন্যদিকে Swift এর String ভ্যালু তৈরী করে যদি কোন ভ্যারিয়েবলে অ্যাসাইন করা হয় অথবা কোন মেথড বা ফাংশনে পাঠানো তাহলে প্রথমে ওই স্ট্রিং এর একটি কপি তৈরী হয় এবং তারপর এই নতুন স্ট্রিং টি মেথডে পাঠানো হয় অথবা নতুন ভ্যারিয়েবলে অ্যাসাইন করা হয়।
আমাদের কাগুজে বইতে এই সম্পর্কে আরও বিস্তারিত থাকবে।

ক্যারেকটার ম্যানিপুলেশনঃ
এতক্ষনে আমরা জেনে গেছি যে, স্ট্রিং আসলে একত্রে থাকা অনেকগুলো Character যা সুইফ্ট এ String টাইপ দিয়ে রিপ্রেজেন্ট করা হয়। প্রত্যেকটি Character আবার একটি ইউনিকোড ক্যারেকটার। সুইফ্টে for-in লুপ দিয়ে একটি স্ট্রিং এর প্রত্যেকটি ক্যারেকটার এক্সেস করা যায়। for-in লুপ এর সিনট্যাক্স ও বিস্তারিত পরের অধ্যায়ে থাকবে। এই মুহুর্তে আমরা একটি স্ট্রিং এর প্রথম থেকে শেষ পর্যন্ত সবগুলা Character এক্সেস করব এবং তা দেখব।

for ch in "Macintosh" {
    println(ch)
}
// M
// a
// c
// i
// n
// t
// o 
// s
// h

আবার কোন এক ক্যারেকটারের স্ট্রিং থেকে Character টাইপ ভ্যারিয়েবল বা কনস্ট্যান্ট ডিক্লেয়ার করার জন্য নিচের মত কোড লিখতে হয়।

let charConstant: Character = "$"
var charVariable: Character = "ক"

স্ট্রিং এ থাকা মোট ক্যারেকটারের সংখ্যা জানাঃ
countElements() একটি গ্লোবাল মেথড যা আর্গুমেন্ট হিসেবে একটি স্ট্রিং নেয় এবং এই স্ট্রিং এ কয়টি ক্যারেকটার আছে তা রিটার্ন করে।

let intro: String = "In Swift, It is too easy to count characters."
var countChar = countElements(intro); 
println(countChar)  // 45

নোটঃ
সুইফ্ট এর স্ট্রিং এর ক্যারেকটারগুলো ইউনিকোড ক্যারেকটার হয় এবং ইউনিকোডে বিভিন্ন ক্যারেকটারের সাইজ ও আলাদা হয়। একারনে সুইফ্ট ল্যাঙ্গুয়েজে সকল ক্যারেকটার একই সাইজের মেমরী নেয় না। তাই countElements() মেথডের রিটার্ন ভ্যালু ও আমাদের চাওয়া অনুযায়ী হয় না। তাই কোন স্ট্রিং এ ক্যারেকটারের সঠিক সংখ্যা জানার জন্য লুপ ব্যবহার করে প্রত্যেকটি ক্যারেকটার গননা করতে হয়। নিচের উদাহরনটিতে প্রথম লাইনে counter ভ্যারিয়েবল ০ দিয়ে ইনিশিয়ালাইজ করা হয়েছে। এরপর for-in লুপ দিয়ে প্রথম থেকে শেষ পর্যন্ত প্রত্যেকটি ক্যারেকটার ভিজিট করা হয় এবং প্রতিবার counter এর ভ্যালু ১ করে বাড়ানো হয়। ফলে for-in টির এক্সিকিউশন শেষ হলে counter ভ্যারিয়েবলে “Macintosh” এর মোট ক্যারেকটারের সংখ্যা পাওয়া যাবে।

var counter = 0
for ch in "Macintosh" {
    counter++;
}
println("This string has \(counter) characters"); // This string has 9 characters

স্ট্রিং এবং ক্যারেকটার কনক্যাট (Concate) করা ঃ
স্ট্রিং ও ক্যারেকটার টাইপ ভ্যারিয়েবল বা কনস্ট্যান্ট একত্রে যুক্ত (Concatenation) করে নতুন স্ট্রিং ইনিশিয়ালাইজ করা যায়। আবার কোন স্ট্রিং এর সাথে ক্যারেকটার যুক্ত (Concate) করে স্ট্রিং টিকে মডিফাই (Modify) করা যায়। নিচের উদাহরন গুলো দেখলেই ব্যপারগুলো বোঝা যাবে।

//Example 1
let string1 = "hello"
let string2 = " Steve"
let character1: Character = "!"
let character2: Character = "?"
 
let stringPlusCharacter = string1 + character1        // equals "hello!"
let stringPlusString = string1 + string2              // equals "hello Steve"
let characterPlusString = character1 + string1        // equals "!hello"
let characterPlusCharacter = character1 + character2  // equals "!?"

//Example 2
var instruction = "follow"
instruction += string2
// instruction now equals "follow Steve"
 
var welcome = "good morning"
welcome += character1
// welcome now equals "good morning!"

স্ট্রিং ইন্টারপুলেশন (String Interpolation)ঃ
কোন স্ট্রিং এর মধ্যে নতুন করে কোন কনস্ট্যান্ট, ভ্যারিয়েবল, এক্সপ্রেশন ইত্যাদির মিশিয়ে নতুন কোন স্ট্রিং তৈরী করা কে বলা হয় স্ট্রিং ইন্টারপুলেশন। এজন্য যে নতুন ভ্যারিয়েবল বা কনস্ট্যান্ট বা এক্সপ্রেশন মেশানো হবে তা প্যারেনথেসিস বা “()” এর ভিতর লিখে তার আগে একটি ব্যাকস্ল্যাশ দিতে হয়। তাহলে স্ট্রিং এই অংশে নতুন জিনিস টি ইনসার্ট হয়ে যায়।

let multiplier = 3
let message = "\(multiplier) times 2.5 is \(Double(multiplier) * 2.5)"
// message is "3 times 2.5 is 7.5"

উপরের কোডটিতে multiplier কনস্ট্যান্টটি ২ বার ব্যবহার করে একটি নতুন স্ট্রিং message তৈরী করা হয়েছে। এজন্য যেসব পজিশনে multiplier এর ভ্যালু ইনসার্ট করা হবে সেসব স্থানে প্রথমে ব্যাকস্ল্যাশ ও তারপর প্যারেনথেসিস দিয়ে multiplier লেখা হয়েছে। ইন্টারপুলেশনের সময় “\(multiplier)” এর পরিবর্তে এখানে multiplier এর ভ্যালু তথা 3 বসবে। এখানে লক্ষ্য করার বিষয় হল প্রথম multiplier টি একটি কনস্ট্যান্ট যা সরাসরি স্ট্রিং টিতে ইনসার্ট করা হয়েছে। কিন্তু ২য় টিতে একটি এক্সপ্রেশন “Double(multiplier) * 2.5” ইনসার্ট করা হয়েছে। প্রথমে multiplier এর ভ্যালু Double দিয়ে কাস্ট (Cast) করে তারপর 2.5 দিয়ে গুন করার পর যে রেসাল্ট পাওয়া যাবে তাই ইনসার্ট করা হয়েছে স্ট্রিং টিতে।

স্ট্রিং কমপ্যারিজন (String Comparison)ঃ
সুইফ্ট (Swift) এর String টাইপের মধ্যকার কমপ্যারিজন করার জন্য ৩টি মেথড রয়েছে : স্ট্রিং(String) ইকুয়্যালিটি, প্রিফিক্স(Prefix) ইকুয়্যালিটি এবং সাফিক্স(Suffix) ইকুয়্যালিটি।

২ টি স্ট্রিং ইকুয়্যাল হবে যদি এবং কেবল যদি উভয় স্ট্রি এর ক্যারেকটারগুলো একই হয় এবং একই অর্ডারে থাকে। এক্ষেত্রে মনে রাখতে হবে বড় হাতের অক্ষর আর ছোট হাতের অক্ষরের ইউনিকোড আলাদা হওয়ায় ক্যারেকটার হিসেবেও এরা আলাদা হবে।

let quotation = "We're a lot alike, you and I."
let sameQuotation = "We're a lot alike, you and I."
if quotation == sameQuotation {
    println("These two strings are considered equal")
}
// prints "These two strings are considered equal"

স্ট্রিং টিতে কোন পার্টিকুলার (particular) স্ট্রিং প্রিফিক্স বা সাফিক্স আছে কিনা তা চেক করার জন্য রয়েছে hasPrefix বা hasSuffix মেথড। উভয় মেথড স্ট্রিং টাইপ আর্গুমেন্ট নিয়ে বুলিয়ান ভ্যালু রিটার্ন করে। আর্গুমেন্টের প্রত্যেকটি ক্যারেকটার মুল স্ট্রিং এ একই অর্ডারে আছে কিনা সেটাই চেক করে মেথড দুটি।

let comment = "Swift is a awesome language."
if comment.hasPrefix("Swift"){
   // String comment contains a "Swift" as prefix  
}

if comment.hasSuffix("language."){
   // String comment contains a "language." as Suffix  
}

উপরের উদাহরনটিতে comment একটি স্ট্রিং টাইপ কনস্ট্যান্ট নেওয়া হয়েছে। hasPrefix(“Swift”) মেথড টি মুলত comment স্ট্রিং এর প্রথমে “Swift” স্ট্রিং টি আছে কিনা। যেহেতু comment স্ট্রিং টিতে প্রিফিক্স হিসেবে “Swift” আছে তাই মেথডটি TRUE রিটার্ন করে। আবার hasSuffix(“language.”) মেথডটি এটাই চেক করছে যে comment স্ট্রিং টি “language.” দিয়ে শেষ হয়েছে কিনা। যেহেতু স্ট্রিং টির শেষ “language.” দিয়ে হয়েছে তাই মেথড টি TRUE রিটার্ন করে।

কেস(Case) কনভারসনঃ
স্ট্রিং ম্যানিপুলেশনের একটি কমন টাস্ক হল কেস কনভারসন। অর্থাৎ ছোট হাতের অক্ষর থেকে বড় হাতের অক্ষর বা বড় হাতের অক্ষর থেকে ছোট হাতের অক্ষরে রুপান্তর করা। সুইফ্টে এই কাজ যথেষ্ট সহজেই করা যায়।

let normal = "Would you mind giving me a glass of Water?"
let uppercase = normal.uppercaseString
// uppercase is equal to "WOULD YOU MIND GIVING ME A GLASS OF WATER?"
let lowercase = normal.lowercaseString
// lowercase is equal to "would you mind giving me a glass of water?"

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

বইয়ের আপডেট পেতে চোখ রাখুন আমাদের ফ্যান পেজে

পরের চাপ্টারঃ 
পরের চাপ্টারে Collections তথা Arrays ও Dictionaries নিয়ে বিস্তারিত থাকবে। এছাড়াও থাকবে Enumerations ও Closures নিয়ে অল্প বিস্তর আলোচনা।

পরের চাপ্টারঃ  কালেকশনস (অ্যারে ও ডিকশনারী), ইনুমারেশন ও ক্লোজার

৩-১ঃ সুইফ্ট (Swift) – অ্যাপলের নতুন চমক (পরিচিতি ও অন্যান্য বেসিক)

Standard

এই সিরিজের পুরো পোস্ট লিস্ট এবং সম্ভাব্য কাগুজে বই এর সূচি দেখতে ক্লিক করুনbangla-ios-objective-c-swift-nuhil

ভুমিকাঃ
অবজেকটিভ-সি (Objective-C) এর বেসিক লার্নিং (সেকশন ১) ও আইওএস জিইউআই (GUI) অ্যাপ ডেভেলপমেন্ট (সেকশন ২) এ নজর রাখার জন্য আপনাকে অসংখ্য অভিনন্দন। আমাদের সেকশন ১ লেখা শেষ হওয়ার সাথে সাথেই অনুষ্ঠিত হয় অ্যাপলের ওয়ার্ল্ড ওয়াইড ডেভেলপার কনফারেন্স – ২০১৪ (WWDC – 2014)। প্রতিবছরের মত এবারও অ্যাপলের ওয়ার্ল্ডওয়াইড ডেভেলপার কনফারেন্স – ২০১৪ (WWDC) -এ ডেভেলপাররা পেয়েছে ৩ টি নতুন চমক। একদিকে আইওস-৮ (iOS 8) ও ইউসেমাইট (Yosemite, OS X 10.1০) এবং অন্যদিকে সুইফ্ট (Swift)। সুইফ্ট হল একেবারেই নতুন একটি প্রোগ্রামিং ল্যাঙ্গুয়েজ যা দিয়ে অবজেক্টিভ-সি এর মতই আইফোন, আইপ্যাড ও আইপডের জন্য অ্যাপ্লিকেশন ডেভেলপ করা যাবে। প্রায় ৩০ বছর ধরে অবজেক্টিভ-সি একাই রাজত্ব করে আসছে আইওএস অ্যাপ্লিকেশন ডেভেলপমেন্ট ফিল্ডে। অ্যাপলের মতে অদুর ভবিষ্যতে অবজেকটিভ-সি কে সরিয়ে এই রাজত্ব দখল করে নেবে সুইফ্ট নিজের ফাস্ট (first), মডার্ন (modern), সেইফ (safe), ইন্টারঅ্যাকটভ (interactive) বৈশিষ্ট্যের দ্বারা।

সুইফ্ট – প্রোগ্রামিং ল্যাঙ্গুয়েজ ঃ
আপনার যদি ওয়েব ডেভেলপমেন্ট (জাভাস্ক্রিপ্ট ও অন্যান্য স্ক্রিপ্টিং ল্যাঙ্গুয়েজ) সম্পর্কে ধারনা থাকে, তাহলে সুইফ্ট এর সিনট্যাক্স আপনার কাছে পরিচিত মনে হবে এবং আপনি অনেক সহজেই সুইফ্টের সিনট্যাক্স আত্মস্থ করতে পারবেন।

কিছু বিশেষ অবস্থার প্রিভিউ দেখার জন্য, সুইফ্টে লেখা প্রোগ্রাম কোন সিমুলেটর এ কম্পাইল ও রান করানো লাগবে না। Xcode 6 এ প্লেগ্রাউন্ড (playground) নামক নতুন ফিচার পাবেন যা দিয়ে সহজে সুইফ্ট এ লেখা প্রোগ্রামের রিয়েল টাইম আউটপুট দেখা যাবে।

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

সুইফ্ট ল্যাঙ্গুয়েজে হ্যালো ওয়ার্ল্ড প্রোগ্রামঃ
XCode 6 এ একটি নতুন প্রজেক্ট ওপেন করি। যেভাবে অবজেক্টিভ-সি ও আইফোন ডেভেলপমেন্ট প্রজেক্ট ওপেন করা হয়, সুইফ্ট এর জন্য একিভাবে প্রজেক্ট ওপেন করতে হয়। শুধুমাত্র প্রথমে Playgroud টাইপ প্রজেক্ট ওপেন করা এবং ল্যাঙ্গুয়েজ লিস্ট থেকে “swift” সিলেক্ট করতে হবে।
এই সুবিধাটি XCode 6 থেকে পাওয়া যাবে।

তাহলে চলুন এবার সুইফ্ট ল্যাঙ্গুয়েজে হ্যালো ওয়ার্ল্ড প্রোগ্রামটি লিখে ফেলিঃ

println("Hello, World")

সদ্য তৈরি করা প্রজেক্টের মুল ফাইলটিতে শুধুমাত্র এটুকু লিখেই রান করলে ডানদিকের আউটপুট উইন্ডোতে “Hello, world” দেখা যাবে।

লাইব্রেরী ইমপোর্ট (Import) করা
সুইফ্ট ল্যাঙ্গুয়েজ দিয়ে করা প্রোগ্রামেও যদি কোন এক্সটার্নাল লাইব্রেরী প্রয়োজন হয় তাহলে প্রজেক্টটিতে ওই লাইব্রেরী ইমপোর্ট করতে হয়। লাইব্রেরী ইমপোর্ট করার জন্য শুধুমাত্র import দিয়ে লাইব্রেরীর নাম লিখলেই হয়।

import Foundation

println("Foundation Library is imported.");

ভ্যারিয়েবল, কনস্ট্যান্ট ও টাইপ অ্যানোটেশনঃ 
অবজেক্টিভ-সি (Objective-C) এর মত ভ্যারিয়েবল বা কনস্ট্যান্ট ডিক্লেয়ার করার জন্য সুইফ্ট এ আসল ডাটাটাইপ লেখা লাগে না। সুইফ্ট এ ভ্যারিয়েবল ডিক্লেয়ার করার জন্য শুধুমাত্র “var” ও কনস্ট্যান্ট ডিক্লেয়ার করার জন্য “let” ব্যবহার করা হয়। সুবিধা হল ভ্যারিয়েবল বা কনস্ট্যান্ট ডিক্লেয়ার করার সময় এর ডাটাটাইপ সম্পর্কে মাথা ঘামানোর প্রয়োজন নেই। যে ধরনের ডাটা দিয়ে ইনিশিয়ালাইজ করা হবে, এদের ডাটাটাইপ ও তাই হবে। নিজের প্রোগ্রামটুকু দেখলেই পরিস্কার হয়ে যাবে।

println("Hello, world")
var myVariable = 42
// myVariable is a variable which will be inferred to be int

var (x, y, z) = (11, 12, 45)                      // x = 11, y = 12, z = 45
// x, y and z variables are inferred to be int

let π = 3.1415926                                 // constant
// π is inferred to be int 

let (x, y) = (10, 20.8)                             // x = 10, y = 20.8
// x is inferred to be int and y is inferred to be double

উপরের কোড থেকে দেখা যাচ্ছে যে parentheses “( )” ব্যবহার করে একসাথে একাধিক ভ্যারিয়েবল বা একাধিক কনস্ট্যান্ট ইনিশিয়ালাইজ করা যায়। আবার কনস্ট্যান্ট এর নাম হিসেবে “π” লেখা হয়েছে। সুইফ্টে ভ্যারিয়েবল বা কনস্ট্যান্ট অথবা অন্যান্য আইডেন্টিফায়ারের নাম গুলোতে যেকোন স্পেশাল ক্যারেকটার এমনকি ইমোজি (emoji) আইকন ও ব্যবহার করা যায়। উদাহরনস্বরুপ,

let π = 3.14159       // any special characters
let 你好 = "你好世界"  // any unicode supported characters
let স্টিভ = "একজন কিংবদন্তীর নাম"  // any unicode supported characters
let 🐶🐮 = "dogcow"     // any emoji icons

emoji ক্যারেকটারের লিস্ট পাওয়ার জন্য কন্ট্রোল + কমান্ড + স্পেসবার একসাথে চাপ দিন।

আপনি চাইলে ভ্যারিয়েবল বা কনস্ট্যান্ট ডিক্লেয়ার করার সময় এক্সপ্লিসিটলি ডাটাটাইপ জানিয়ে দিতে পারেন। এজন্য ভ্যারিয়েবল বা কনস্ট্যান্ট এর নামের পর কোলন (ঃ) ও তারপর স্পেস দিয়ে ডাটাটাইপ লিখতে হয়। এভাবে আলাদা করে ডাটাটাইপ সম্পর্কে জানানো কে বলা হয় টাইপ অ্যানোটেশন (Type Annotation)।

var annotatedMessage: String = "Hello World! This variable is Type Annotated"

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

println("I am the first statement. I need semicolon"); println("I am the last statement. I don't need semicolon")
println("Another Line, I don't need any semicolon.But you can give me a semicolon if you want.");

অপারেটরঃ
অন্যান্য প্রোগ্রামিং ল্যাঙ্গুয়েজের অপারেটর গুলোর সাথে সুইফ্ট এর অপারেটর গুলোর মধ্যে তেমন কোন পার্থক্য নেই। তবে কিছু কিছু ক্ষেত্রে অনেকটা ইমপ্রুভমেন্ট এনেছে সুইফ্ট। নিচে ক্যাটেগরী অনুযায়ী কিছু অপারেটর সম্পর্কে ধারনা দেওয়া হলঃ

অ্যাসাইনমেন্ট অপারেটর (=)
অ্যাসাইনমেন্ট অপারেটর (=) একটি বাইনারি অপারেটর। অর্থাত “=” এর দুইটি অপারেন্ড (Operands) থাকবে এবং ডানদিকের ভ্যালু বামদিকের ভ্যারিয়েবল বা কনস্ট্যান্ট এ অ্যাসাইন হবে।

let a = 5
let b = 10
var c = a + b
var (x, y) = (a, b)   // a is assigned to x and b is assigned to y
var httpNotFoundError = (404, "Page Not Found")

শেষ লাইন দুটি দেখে বোঝা যাচ্ছে যে, এভাবে “=” অপারেটরের ডানদিকে যদি একাধিক ডাটা থাকে তাহলে তা বামদিকের একাধিক সংখ্যক ভ্যারিয়বল বা কনস্ট্যান্ট এ অ্যাসাইন হতে পারে। আবার কোন একটি ভ্যারিয়েবল বা কনস্ট্যান্ট এর ভ্যালু একাধিক ভ্যালুর টাপল [ var a = (b,c) ] হতে পারে।

অ্যারাথমেটিক অপারেটর
অন্যান্য সকল প্রোগ্রামিং ল্যাঙ্গুয়েজের অ্যারাথমেটিক অপারেটর গুলোর মতই সুইফ্ট এর অ্যারাথমেটিক অপারেটর গুলো নিজ নিজ অপারেশন করে।

1 + 2       // equals 3 (Addition)
5 - 3       // equals 2 (Subtraction)
2 * 3       // equals 6 (Multiplication)
10.0 / 2.5  // equals 4.0 (Division)
9 % 4       // equals 1 (Remainder after division)
-9 % 4      // equals -1 (Remainder after division)
8 % 2.5     // equals 0.5

“+” অপারেটর দিয়ে স্ট্রিং কনক্যাটেনেশনও করা যায়।

var msg1 = "Hello"
var msg2 = "World"
var concatenated = msg1 + msg2
println(concatenated)    // Hello World

অন্যান্য অ্যারাথমেটিক অপারেটর

var a = 10;
++a      // equals 11
a++      // equals 11

// currenlty a is 11
var b = a++  // b = 11, but a = 12
// at first a is assigned to b. So, value of b is same as current a (11). Then a is incremented by 1. So, value of as is 12. 

//currently a is 12
var b = ++a  // b = 13, and a = 13
// at first a is incremented by 1. So, value of a is 13 (12+1). Then value of a is assigned to b. So, value of b is also 13

//currenly a is 13
var b = a--  // b = 13, but a = 12
// at first a is assigned to b. So, value of b is same as current a (13). Then a is decremented by 1. So, value of as is 12. 

//currently a is 11
var b = --a  // b = 11, and a = 11
// at first a is decremented by 1. So, value of a is 13 (12+1). Then value of a is assigned to b. So, value of b is also 13

কমপ্যারিজন/কন্ডিশনাল অপারেটর
সুইফ্ট সকল ধরনের কন্ডিশনাল অপারেটর গুলো সাপোর্ট করে। নিচে কয়েকটি অপারেটরের নাম দেওয়া হলঃ

  • Equal to (a == b)
  • Not equal to (a != b)
  • Greater than (a > b)
  • Less than (a < b)
  • Greater than or equal to (a >= b)
  • Less than or equal to (a <= b)
1 == 1   // true, because 1 is equal to 1
2 != 1   // true, because 2 is not equal to 1
2 > 1    // true, because 2 is greater than 1
1 < 2    // true, because 1 is less than 2
1 >= 1   // true, because 1 is greater than or equal to 1
2 <= 1   // false, because 2 is not less than or equal to 1

//ternary conditional operator
let hasHeader = true
let contentHeight = 100
let rowHeight = contentHeight + (hasHeader ? 50 : 20)  // rowHeight will be 50

এধরনের অপারেটর গুলো প্রোগ্রামের বিভিন্ন সিলেকশন বা ডিসিশন নেওয়ার সময় ব্যবহৃত হয়। পরবর্তী অধ্যায়সমুহে এ ব্যাপারে বিস্তারিত আলোচনা হবে।

এছাড়াও রয়েছে লজিক্যাল অপারেটর ও রেন্জ অপারেটর। সকল অপারেটর সম্পর্কে আরও বিস্তারিত আলোচনা ও বিশ্লেষণ থাকবে আমাদের আসছে প্রিন্টেড বইয়ে।

বইয়ের আপডেট পেতে চোখ রাখুন আমাদের ফ্যান পেজে

পরের চাপ্টারঃ 
পরের চাপ্টারে সুইফ্ট ল্যাঙ্গুয়েজ দিয়ে স্ট্রিং ও ক্যারেকটার এর ম্যানিপুলেশন সম্পর্কে বিস্তারিত থাকবে। এছাড়া কিভাবে স্ট্রিং কে মিউটেবল করা হয়, কিভাবে একটি স্ট্রিং থেকে নির্দিস্ট ইনডেক্সের ক্যারেকটার খুজতে হয়, কিভাবে ইন্টারপুলেশন, কমপ্যারিজন করতে হয় ইত্যাদি সম্পর্কে থাকবে বিস্তারিত।

পরের চাপ্টারঃ  সুইফ্ট ল্যাঙ্গুয়েজে স্ট্রিং ও ক্যারেকটার টাইপ ভ্যারিয়েবল

৬-১ – অবজেক্টিভ-সি (Objective-C) নাকি সুইফ্ট (Swift) ?

Standard

এটি হচ্ছে আমাদের চলতি “বাংলায়- অবজেক্টিভ-সি, সুইফ্ট এবং iOS অ্যাপ ও গেম ডেভেলপমেন্ট” সম্পর্কিত সিরিজ পোস্ট ও প্রকাশিতব্য বইয়ের ষষ্ঠ সেকশন (কিছু সাধারণ প্রশ্ন ও উত্তর) এর প্রথম চ্যাপ্টার।

ভূমিকাঃ
আপনি যদি Apple এর WWDC (Worldwide Developer’s Conference) সম্পর্কে মোটা মুটি অবগত থাকেন অথবা ইনফরমেশন টেকনোলজি সম্পর্কিত  আন্তর্জাতিক খবর গুলো খেয়াল করে থাকেন, তাহলে জেনে থাকবেন যে Apple তাদের WWDC 2014 ইভেন্টে সবচেয়ে চমকপ্রদ যে আবিষ্কারটির ঘোষণা দিয়েছে তা হচ্ছে তাদের তৈরি সম্পূর্ণ নতুন একটি প্রোগ্রামিং ল্যাঙ্গুয়েজের খবর। যার নাম Swift. তারা চায় তাদের ভবিষ্যৎ iOS এবং OSX অ্যাপ্লিকেশন গুলো এই ল্যাঙ্গুয়েজ দিয়েই ডেভেলপ করা হোক যাতে করে এই প্ল্যাটফর্মের অ্যাপ গুলোর পারফরমেন্স আরও ভালো হয়।
এটাকে তারা বলছে, দ্রুতগতি সম্পন্ন, আধুনিক, নিরাপদ ও ইন্টার‌অ্যাক্টিভ একটি ল্যাঙ্গুয়েজ। অন্যান্য ল্যাঙ্গুয়েজের মত অনেক অনেক জনপ্রিয় ফিচার এই ল্যাঙ্গুয়েজে যুক্ত আছে। এর ডিজাইন এমন ভাবে করা হয়েছে যাতে সিনট্যাক্স আরও সহজ হয় এবং iOS ও OSX ডেভেলপমেন্ট শুরু করতে নতুনদের বাধা আরও কম হয়। এমনকি আসছে সেপ্টেম্বর, ২০১৪ তে যে Xcode 6 লঞ্চ হতে যাচ্ছে তার সঙ্গে Playground নামের একটি ফিচার থাকছে যার মাধ্যমে বিভিন্ন কোড, প্রোগ্রামিং লজিক এবং ক্যালকুলেশনের লাইভ প্রিভিউ দেখা যাবে পুরো প্রোগ্রাম রান না করেই। অর্থাৎ Apple বরাবরই ডেভেলপার ফ্রেন্ডলি একটা ডেভেলপমেন্ট প্ল্যাটফর্ম দেয়ার ব্যাপারে সবসময় গুরুত্ব দিয়েছে যারই বহিঃপ্রকাশ হিসেবে Swift এর জন্ম বলতে পারেন। অতএব, ভয় না পেয়ে এর কাছ থাকে ভালো কিছুই আশা করতে পারেন নতুন এবং পুরনো iOS এবং OSX ডেভেলপারেরা।

আমি এই প্ল্যাটফর্মে নতুন, আমার কি এখন অব্জেক্টিভ-সি অথবা সুইফ্ট নাকি দুটো ল্যাঙ্গুয়েজ-ই শেখা উচিত?
প্রথমত, সুইফ্ট (Swift) একটি নতুন প্রোগ্রামিং ল্যাঙ্গুয়েজ, আর তাই এটাতে আরও নতুন নতুন ফিচার যুক্ত হওয়া থেকে শুরু করে বিভিন্ন বাগ ফিক্সিং চলতেই থাকবে সামনের অন্তত এক দুই বছর। আর তাই Apple এটার ব্যাপারে প্রচার চালিয়ে যাবে ঠিকই কিন্তু আপনাকে বাধ্য করবে না iOS এর অ্যাপ শুধুমাত্র Swift এ করার জন্য। আর অন্যদিকে অবজেক্টিভ-সি রাতারাতি বন্ধও হয়ে যাবে না।
দ্বিতীয়ত, ইতোমধ্যে Apple অ্যাপ স্টোরে ১০ লাখেরও বেশি অ্যাপ্লিকেশন আছে যেগুলো অবজেক্টভ-সি তে করা এবং ওয়েবে কয়েক লাখ জনপ্রিয় লাইব্রেরি, ফ্রেমওয়ার্ক ওপেন সোর্স টুলস ও প্রজেক্ট আছে যেগুলোও অবজেক্টিভ-সি তে ডেভেলপ করা। আর তাই এগুলোর এনহ্যান্সমেন্ট, বাগ ফিক্সিং এবং আপগ্রেড চলবে আরও অনেক দিন আর তার জন্য অবশ্যই অব্জেক্টিভ-সি তে অভিজ্ঞ ডেভেলপার বা প্রোগ্রামারের প্রয়োজন থাকছেই।
তৃতীয়ত, Swift এবং iOS 7,8 সাথে Xcode 6 এমন ভাবে প্রস্তুত আছে যে আপনি একটি প্রোজেক্টে একি সাথে অবজেক্টিভ-সি এবং সুইফ্ট ল্যাঙ্গুয়েজ ব্যবহার করতে পারেন কোন রকম বাড়তি ঝামেলা ছাড়াই। আর এই যুগপৎ বিদ্যমানতা এটাই প্রমাণ করে যে, সুইফ্ট একবারেই অবজেক্টিভ-সি এর জায়গা দখল করে নিচ্ছে না। আরও দেখতে পারেন এখানে

আর তাই, যদি আপনি কোন iOS ডেভেলপার কোম্পানিতে জয়েন করতে চান অথবা নিজে থেকেই এই মার্কেটে অ্যাপ লঞ্চ করতে চান আপনাকে দুটো ল্যাঙ্গুয়েজেই সম্যক ধারনা নেয়া খুবি গুরুত্বপূর্ণ।

আমি বেশকিছু দিন ধরেই অবজেক্টিভ-সি তে অ্যাপ ডেভেলপমেন্ট এর কাজ করে আসছি কিন্তু এখন কি আমি একজন কেবলই নতুন শিক্ষানবিস?
একদম না। চিন্তা করে দেখুন, আপনি ইতোমধ্যে Xcode, Cocoa এবং Cocoa Touch এর বিভিন্ন API এবং অবজেক্টিভ-সি তে অভিজ্ঞতা অর্জন করেছেন যার মাধ্যমে চলছে কয়েক লাখ অ্যাপ – তার তুলনায় Swift শেখা কিছুই না। বরং আপনি আপনার অভিজ্ঞতার ভাণ্ডারে নতুন একটি জিনিষ যুক্ত করতে যাচ্ছেন মাত্র। অন্যদের থেকে তার মানে আপনি সিংহ ভাগ এগিয়ে থাকছেনই সব সময়।

সুইফ্ট দিয়ে ডেভেলপমেন্টের সুবিধা কি?
Apple এর মতে এটা ৩০ বছর বয়সী Objectiv-C এর চেয়ে অনেকটাই আধুনিক। আর তাই এতে প্রোগ্রামারদের অনেক প্রিয় কিছু ফিচার যেমন namespacing, optionals, tuples, generics, type inference ইত্যাদি থাকছে যা অবশ্যই সফটওয়্যার ডেভেলপমেন্টকে আরও বেশি যুগোপযোগী আর গুনমান সম্পন্ন করবে।
অন্যদিকে এই ল্যাঙ্গুয়েজের অবজেক্ট সর্টিং, এক্সিকিউশন সহ আরও কিছু বিষয়ে টাইম কমপ্লেক্সিটি অনেক কম।

কোথায় শেখা শুরু করবো?
সবসময় নতুন কিছু শুরু করতে বা ওই বিষয়ে জানতে সেটার অফিসিয়াল সোর্স থেকেই দেখে নেয়া উচিত। যেমন নিচের সোর্স দুটি হতে পারে সঠিক দিক নির্দেশনাঃ

আর আমরা তো আছিই। আমাদের এই সিরিজের এবং সম্ভাব্য বইয়ের দ্বিতীয় সেকশনেই থাকছে বাংলায় ব্যাসিক সুইফ্ট লার্নিং এর উপর ১০টির বেশি চ্যাপ্টার। সিরিজের সব পোষ্ট গুলোর এবং প্রিন্টেড বইয়ের আপডেট পেতে লাইক দিয়ে রাখুন আমাদের ফেসবুকে ফ্যান পেজে

আমাদের ব্লগ পোস্ট গুলোর চেয়ে অনেক বেশি বিস্তারিত আলোচনা, বিশ্লেষণ এবং কোড এক্সাম্পল থাকবে প্রিন্টেড বইয়ে।

পরের চ্যাপ্টারঃ পরের চ্যাপ্টারে থাকবে একটি সাধারণ প্রশ্ন যেটা অনেকেরই মনে জমে থাকে, “iOS এবং OSX এর অ্যাপ ডেভেলপমেন্টের জন্য Macbook, iMac, Mac mini অর্থাৎ Apple গ্যাজেট বাধ্যতামূলক কিনা” এর উপর আলোচনা এবং কিছু বিশ্লেষণ ও অবশ্যই কিছু বিকল্প ব্যবস্থার কথা।