অ্যারে হলো Swift-এর তিনটি প্রধান কালেকশন টাইপের একটি। অ্যারে হলো এলিমেন্টের একটি ক্রমানুসারী তালিকা। অ্যারে যেকোনো টাইপের এলিমেন্ট সংরক্ষণ করতে পারে, তবে একটি নির্দিষ্ট অ্যারের সব এলিমেন্টের টাইপ একই হতে হবে। কোনো ভ্যারিয়েবলে অ্যাসাইন করা হলে অ্যারে পরিবর্তনযোগ্য হয়, অর্থাৎ অ্যারে তৈরির পরেও আপনি এলিমেন্ট যোগ করতে, মুছতে বা পরিবর্তন করতে পারেন। কনস্ট্যান্টে অ্যাসাইন করা হলে অ্যারে অপরিবর্তনযোগ্য হয়, অর্থাৎ এর ভেতরের কিছুই পরিবর্তন করা যায় না।
অ্যারে লিটারাল লেখা হয় কমা দিয়ে আলাদা করা এলিমেন্টের তালিকা হিসেবে, যা বর্গাকার বন্ধনীর ([...]) ভেতরে রাখা হয়।
লিটারালের ভেতরের এলিমেন্টগুলো থেকে Swift অ্যারের টাইপ অনুমান করতে পারে।
let evenInts = [2, 4, 6, 8, 10, 12]
var oddInts = [1, 3, 5, 7, 9, 11, 13]
let greetings = ["Hello!", "Hi!", "¡Hola!"]
আপনি চাইলে টাইপ স্পষ্টভাবেও উল্লেখ করতে পারেন।
অ্যারের টাইপ দুভাবে লেখা যায়: Array<T> অথবা সংক্ষিপ্ত সিনট্যাক্স [T], যেখানে T হলো অ্যারেতে থাকা মানগুলোর টাইপ।
let evenInts: Array<Int> = [2, 4, 6, 8, 10, 12]
var oddInts: [Int] = [1, 3, 5, 7, 9, 11, 13]
let greetings: [String] = ["Hello!", "Hi!", "¡Hola!"]
এর count প্রপার্টি ব্যবহার করে আপনি একটি অ্যারের এলিমেন্ট সংখ্যা জানতে পারেন:
evenInts.count
// returns 6
একটি খালি অ্যারে তৈরি করতে হলে তার টাইপ অবশ্যই উল্লেখ করতে হবে। এটি করা যায় অ্যারে ইনিশিয়ালাইজার সিনট্যাক্স দিয়ে, অথবা স্পষ্ট টাইপ অ্যানোটেশন দিয়ে:
let emptyArray = [Int]()
let emptyArray2 = Array<Int>()
let emptyArray3: [Int] = []
অ্যারে নেস্টেড করে বহুমাত্রিক অ্যারে তৈরি করা যায়।
নেস্টেড অ্যারের টাইপ স্পষ্টভাবে উল্লেখ করার সময় এলিমেন্ট টাইপটিকে নেস্টেড বন্ধনীর ভেতরে রাখুন, যেমন [[Int]] বা Array<Array<Int>>:
let multiDimArray = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
let multiDimArray2: [[Int]] = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
append(_:) মেথড ব্যবহার করে আপনি একটি পরিবর্তনযোগ্য অ্যারের শেষে একটি এলিমেন্ট যোগ করতে পারেন:
var oddInts = [1, 3, 5, 7, 9, 11, 13]
oddInts.append(15)
// oddInts is now [1, 3, 5, 7, 9, 11, 13, 15]
insert(_:at:) মেথড ব্যবহার করে আপনি নির্দিষ্ট ইনডেক্সে একটি এলিমেন্ট ঢোকাতে পারেন।
এই মেথডটি দুটি আর্গুমেন্ট নেয়: যে এলিমেন্টটি ঢোকাতে চান, এবং যে ইনডেক্সে ঢোকাতে চান।
var oddInts = [1, 3, 5, 7, 9, 11, 13]
oddInts.insert(0, at: 0)
// oddInts is now [0, 1, 3, 5, 7, 9, 11, 13]
+ অপারেটর ব্যবহার করে আপনি দুটি অ্যারে মিলিয়ে একটি অ্যারে বানাতে পারেন।
+ অপারেটরটি একটি নতুন অ্যারে তৈরি করে রিটার্ন করে; এটি মূল অ্যারেগুলো পরিবর্তন করে না।
var oddInts = [1, 3, 5, 7, 9, 11, 13]
let combined = oddInts + [15, 17, 19]
// combined is [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
print(oddInts)
// prints [1, 3, 5, 7, 9, 11, 13]
অ্যারের নামের পরে বর্গাকার বন্ধনীর ([]) ভেতরে ইনডেক্স বসিয়ে আপনি অ্যারের একটি নির্দিষ্ট এলিমেন্ট অ্যাক্সেস করতে পারেন।
অ্যারের ইনডেক্সগুলো শূন্য-ভিত্তিক Int মান, প্রথম এলিমেন্টের জন্য যা 0 থেকে শুরু হয়।
বৈধ সীমার বাইরের কোনো ইনডেক্স অ্যাক্সেস করলে রানটাইম এরর হয় এবং প্রোগ্রামটি ক্র্যাশ করে।
let evenInts = [2, 4, 6, 8, 10, 12]
let oddInts = [1, 3, 5, 7, 9, 11, 13]
evenInts[2]
// returns 6
oddInts[7]
// Fatal error: Index out of range
নির্দিষ্ট ইনডেক্সে নতুন মান অ্যাসাইন করে আপনি পরিবর্তনযোগ্য অ্যারের একটি এলিমেন্ট বদলাতে পারেন। এলিমেন্ট পড়ার মতোই, বৈধ সীমার বাইরের ইনডেক্স ব্যবহার করলে রানটাইম এরর হয়।
var evenInts = [2, 4, 6, 8, 10, 12]
evenInts[2] = 0
// evenInts is now [2, 4, 0, 8, 10, 12]
joined(separator:) মেথড ব্যবহার করে স্ট্রিংয়ের একটি অ্যারে জোড়া দিয়ে একটি স্ট্রিং বানাতে পারেন; এই মেথডটি একটি সেপারেটর স্ট্রিং নেয়:
let evenInts = ["2", "4", "6", "8", "10", "12"]
let evenIntsString = evenInts.joined(separator: ", ")
// returns "2, 4, 6, 8, 10, 12"
split(separator:) মেথড ব্যবহার করে, ডেলিমিটার ক্যারেক্টারটি পাস করে, আপনি একটি স্ট্রিংকে সাবস্ট্রিংয়ের অ্যারেতে ভাগ করতে পারেন:
let evenIntsString = "2, 4, 6, 8, 10, 12"
let evenInts = evenIntsString.split(separator: ",")
// returns ["2", " 4", " 6", " 8", " 10", " 12"]
remove(at:) মেথড ব্যবহার করে আপনি নির্দিষ্ট ইনডেক্সের একটি এলিমেন্ট মুছে ফেলতে পারেন।
ইনডেক্সটি অ্যারের বৈধ সীমার মধ্যেই থাকতে হবে; নাহলে রানটাইম এরর হয়।
var oddInts = [1, 3, 5, 7, 9, 11, 13]
oddInts.remove(at: 3)
// oddInts is now [1, 3, 5, 9, 11, 13]
অ্যারের শেষ এলিমেন্টটি মুছে ফেলতে removeLast() মেথডটি ব্যবহার করুন।
খালি অ্যারেতে removeLast() কল করলে রানটাইম এরর হয়।
var oddInts = [1, 3, 5, 7, 9, 11, 13]
oddInts.removeLast()
// oddInts is now [1, 3, 5, 7, 9, 11]
ভবিষ্যৎ জাদুকর এলিসের কিছু মৌলিক বিষয় অনুশীলন করা দরকার। তার কাছে কার্ডের একটি স্ট্যাক আছে, যা নিয়ে সে কার্সাজি করতে চায়।
কাজটা একটু সহজ করতে সে শুধু ১ থেকে ১০ নম্বরের কার্ডগুলোই ব্যবহার করে, তাই তার কার্ডের স্ট্যাককে সংখ্যার একটি অ্যারে দিয়ে প্রকাশ করা যায়। কোনো একটি কার্ডের অবস্থান অ্যারের ইনডেক্সের সাথে মিলে যায়। অর্থাৎ অবস্থান ০ মানে প্রথম কার্ড, অবস্থান ১ মানে দ্বিতীয় কার্ড, ইত্যাদি।
সব ফাংশনের উচিত কার্ডের অ্যারেটি হালনাগাদ করা এবং তারপর পরিবর্তিত অ্যারেটি রিটার্ন করা। এভাবে কাজ করার একটি কমন ধরনকে বলা হয় Builder pattern, যা দিয়ে সুন্দরভাবে একটার পর একটা ফাংশন জুড়ে দেওয়া যায়।
একটি কার্ড বাছতে প্রদত্ত স্ট্যাক থেকে position ইনডেক্সে থাকা কার্ডটি রিটার্ন করুন।
getCard(at:from:) ফাংশনটি ইমপ্লিমেন্ট করুন, যা দুটি আর্গুমেন্ট নেয়: at, অর্থাৎ স্ট্যাকে কার্ডটির অবস্থান, এবং from, অর্থাৎ কার্ডের স্ট্যাক। ফাংশনটি প্রদত্ত স্ট্যাক থেকে index অবস্থানের কার্ডটি রিটার্ন করবে।
let index = 2
getCard(at: index, from: [1, 2, 4, 1])
// returns 4
একটু হাতের কৌশল দেখিয়ে position ইনডেক্সের কার্ডটি প্রদত্ত বিকল্প কার্ডের সাথে অদলবদল করুন।
setCard(at:in:to) ফাংশনটি ইমপ্লিমেন্ট করুন, যা তিনটি আর্গুমেন্ট নেয়: at, অর্থাৎ স্ট্যাকে কার্ডটির অবস্থান, in, অর্থাৎ কার্ডের স্ট্যাক, এবং to, অর্থাৎ index অবস্থানের কার্ডটি বদলে দেওয়ার নতুন কার্ড। ফাংশনটি স্ট্যাকের একটি কপি রিটার্ন করবে, যেখানে index অবস্থানের কার্ডটি নতুন কার্ড দিয়ে বদলে দেওয়া হয়েছে। প্রদত্ত index যদি স্ট্যাকে বৈধ ইনডেক্স না হয়, তাহলে মূল স্ট্যাকটি অপরিবর্তিত অবস্থায় রিটার্ন করা উচিত।
let index = 2
let newCard = 6
setCard(at: index, in: [1, 2, 4, 1], to: newCard)
// returns [1, 2, 6, 1]
স্ট্যাকের একেবারে উপরে একটি নতুন কার্ড ঢুকিয়ে একটি কার্ডকে হাজির করুন।
insert(_:atTopOf:) ফাংশনটি ইমপ্লিমেন্ট করুন, যা দুটি আর্গুমেন্ট নেয়: যে নতুন কার্ডটি ঢোকানো হবে, এবং কার্ডের স্ট্যাক। ফাংশনটি স্ট্যাকের একটি কপি রিটার্ন করবে, যেখানে প্রদত্ত নতুন কার্ডটি স্ট্যাকের উপরে যোগ করা হয়েছে।
let newCard = 8
insert(newCard, atTopOf: [5, 9, 7, 1])
// returns [5, 9, 7, 1, 8]
প্রদত্ত position থেকে কার্ডটি সরিয়ে একটি কার্ডকে উধাও করুন।
removeCard(at:from:) ফাংশনটি ইমপ্লিমেন্ট করুন, যা দুটি আর্গুমেন্ট নেয়: at, অর্থাৎ স্ট্যাকে কার্ডটির অবস্থান, এবং from, অর্থাৎ কার্ডের স্ট্যাক। ফাংশনটি স্ট্যাকের একটি কপি রিটার্ন করবে, যেখানে index অবস্থানের কার্ডটি সরিয়ে ফেলা হয়েছে। প্রদত্ত index যদি স্ট্যাকে বৈধ ইনডেক্স না হয়, তাহলে মূল স্ট্যাকটি অপরিবর্তিত অবস্থায় রিটার্ন করা উচিত।
let index = 2
removeCard(at: index, from: [3, 2, 6, 4, 8])
// returns [3, 2, 4, 8]
প্রদত্ত position অবস্থানে স্ট্যাকে একটি নতুন কার্ড ঢুকিয়ে একটি কার্ডকে হাজির করুন।
insert(_:at:from:) ফাংশনটি ইমপ্লিমেন্ট করুন, যা তিনটি আর্গুমেন্ট নেয়: যে নতুন কার্ডটি ঢোকানো হবে, যে অবস্থানে নতুন কার্ডটি ঢোকানো উচিত, এবং কার্ডের স্ট্যাক। ফাংশনটি স্ট্যাকের একটি কপি রিটার্ন করবে, যেখানে প্রদত্ত নতুন কার্ডটি প্রদত্ত অবস্থানে যোগ করা হয়েছে। প্রদত্ত index যদি স্ট্যাকে বৈধ ইনডেক্স না হয়, তাহলে মূল স্ট্যাকটি অপরিবর্তিত অবস্থায় রিটার্ন করা উচিত।
let newCard = 8
insert(newCard, at: 2, from: [5, 9, 7, 1])
// returns [5, 9, 8, 7, 1]
স্ট্যাকের আকার stackSize-এর সমান কি না তা যাচাই করুন।
checkSizeOfStack(_:_:) ফাংশনটি ইমপ্লিমেন্ট করুন, যা দুটি আর্গুমেন্ট নেয়: stack, অর্থাৎ কার্ডের স্ট্যাক, এবং stackSize, অর্থাৎ স্ট্যাকের আকার। স্ট্যাকের আকার stackSize-এর সমান হলে ফাংশনটি true রিটার্ন করবে, অন্যথায় false।
let stackSize = 4
checkSizeOfStack([3, 2, 6, 4, 8], stackSize)
// returns false
Exercism-এ সাইন আপ করুন, Swift ট্র্যাকের 35টি কনসেপ্ট116টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।