Swift-এ স্ট্রাক্ট (Struct) এবং এনাম (Enum)
Swift-এ স্ট্রাক্ট এবং এনাম দুটি গুরুত্বপূর্ণ ডেটা টাইপ যা কোডকে সুসংহত এবং সংগঠিত করতে সাহায্য করে। নিচে এদের বিস্তারিত আলোচনা করা হলো:
১. স্ট্রাক্ট (Struct)
স্ট্রাক্ট হলো একটি ডেটা স্ট্রাকচার যা ভেরিয়েবল, কনস্ট্যান্ট, এবং মেথডগুলি একত্রে ধারণ করে। এটি সাধারণত ছোট ও সাধারণ ডেটা মডেল তৈরি করতে ব্যবহৃত হয়।
উদাহরণ:
struct Person {
var name: String
var age: Int
func greet() {
print("Hello, my name is \(name) and I am \(age) years old.")
}
}
let person1 = Person(name: "Alice", age: 25)
person1.greet() // আউটপুট: "Hello, my name is Alice and I am 25 years old."
স্ট্রাক্টের বৈশিষ্ট্য:
- স্ট্রাক্ট সাধারণত ভ্যালু টাইপ, অর্থাৎ কপি করা হলে একটি নতুন কপি তৈরি হয়।
- এটি ক্লাসের মতোই প্রপার্টি এবং মেথড রাখতে পারে, তবে ইনহেরিটেন্স সমর্থন করে না।
২. এনাম (Enum)
এনাম হলো একটি ডেটা টাইপ যা একগুচ্ছ নির্দিষ্ট মান সংজ্ঞায়িত করে। এটি প্রোগ্রামের বিভিন্ন স্টেট বা অপশনাল কন্ডিশনগুলি রিপ্রেজেন্ট করতে ব্যবহৃত হয়।
উদাহরণ:
enum Direction {
case north
case south
case east
case west
}
var currentDirection = Direction.north
switch currentDirection {
case .north:
print("Going north")
case .south:
print("Going south")
case .east:
print("Going east")
case .west:
print("Going west")
}
এনামের বৈশিষ্ট্য:
- প্রতিটি মান একক এবং অনন্য।
- এটি মেথড এবং কম্পিউটেড প্রপার্টি ধারণ করতে পারে, যা কোডকে আরও সুসংহত করতে সাহায্য করে।
- এটি অ্যাসোসিয়েটেড ভ্যালু এবং র অ্যান্ড ইন্টারফেস সমর্থন করে, যার ফলে প্রতিটি কেসের সাথে ভিন্ন ধরনের ডেটা যুক্ত করা যায়।
স্ট্রাক্ট বনাম এনাম
| বৈশিষ্ট্য | স্ট্রাক্ট (Struct) | এনাম (Enum) |
|---|---|---|
| টাইপ | ভ্যালু টাইপ | ভ্যালু টাইপ |
| ইনহেরিটেন্স | ইনহেরিটেন্স সাপোর্ট করে না | ইনহেরিটেন্স সাপোর্ট করে না |
| ব্যবহার | সাধারণ ডেটা মডেল বা কাস্টম ডেটা টাইপ | নির্দিষ্ট মান বা স্টেট সংজ্ঞায়িত করতে |
সংক্ষেপে
- স্ট্রাক্ট: সাধারণ ডেটা মডেল এবং ভ্যালু টাইপ ম্যানেজ করতে।
- এনাম: নির্দিষ্ট মানের সেট বা কন্ডিশন সংজ্ঞায়িত করতে।
Swift-এ স্ট্রাক্ট এবং এনাম ব্যবহার করে কোডকে আরও সংগঠিত, কার্যকরী এবং সহজে পড়ার মতো রাখা যায়।
Swift-এ স্ট্রাক্ট (Struct) হলো একটি ডেটা স্ট্রাকচার, যা ক্লাসের মতোই বিভিন্ন প্রোপার্টি এবং মেথড ধারণ করতে পারে। তবে, স্ট্রাক্ট হলো ভ্যালু টাইপ, যেখানে ক্লাস হলো রেফারেন্স টাইপ। স্ট্রাক্ট ব্যবহার করে আপনি সহজে ডেটার একটি কাস্টম টাইপ তৈরি করতে পারেন, যা Swift-এর বিল্ট-ইন ডেটা টাইপের মতোই কাজ করে। স্ট্রাক্ট সাধারণত ছোট এবং সাধারণ ডেটা মডেল তৈরির জন্য ব্যবহার করা হয়।
স্ট্রাক্ট কী?
স্ট্রাক্ট হলো এক ধরনের ডেটা স্ট্রাকচার, যা ভেরিয়েবল এবং ফাংশনকে একত্রিত করে। স্ট্রাক্ট তৈরি করতে struct কীওয়ার্ড ব্যবহার করা হয়। স্ট্রাক্ট ভ্যালু টাইপ হওয়ায়, এটি একটি ভেরিয়েবল বা কনস্ট্যান্টে অ্যাসাইন বা পাস করার সময় কপি তৈরি করে, যেখানে ক্লাস রেফারেন্স হিসেবে কাজ করে।
স্ট্রাক্টের গঠন
struct StructName {
// প্রোপার্টি
var property1: Type
var property2: Type
// মেথড
func methodName() {
// কার্যক্রম
}
}
struct: স্ট্রাক্ট ডিফাইন করার জন্য কীওয়ার্ড।- প্রোপার্টি: স্ট্রাক্টের বৈশিষ্ট্য বা ডেটা, যা সাধারণত ভেরিয়েবল বা কনস্ট্যান্ট হিসেবে থাকে।
- মেথড: স্ট্রাক্টের কার্যক্রম বা ফাংশন, যা ফাংশন আকারে ডিফাইন করা হয়।
একটি স্ট্রাক্ট উদাহরণ
struct Person {
var name: String
var age: Int
func greet() {
print("Hello, my name is \(name) and I am \(age) years old.")
}
}
// স্ট্রাক্ট থেকে অবজেক্ট তৈরি
let person1 = Person(name: "Alice", age: 25)
person1.greet() // Output: "Hello, my name is Alice and I am 25 years old."
- এখানে,
Personনামের একটি স্ট্রাক্ট ডিফাইন করা হয়েছে, যাnameএবংageনামে দুটি প্রোপার্টি ধারণ করে এবং একটি মেথডgreet()রয়েছে। person1হলোPersonস্ট্রাক্ট থেকে তৈরি করা একটি অবজেক্ট।
ভ্যালু টাইপের বৈশিষ্ট্য
স্ট্রাক্ট Swift-এ ভ্যালু টাইপ হিসেবে কাজ করে, অর্থাৎ এটি কপি করে কাজ করে। যদি একটি স্ট্রাক্ট অবজেক্টকে অন্য একটি ভেরিয়েবল বা কনস্ট্যান্টে অ্যাসাইন করা হয়, তবে তার একটি কপি তৈরি হয়, এবং কোনো পরিবর্তন সেই কপিতে প্রভাব ফেলে না।
var person1 = Person(name: "Alice", age: 25)
var person2 = person1
person2.name = "Bob"
print(person1.name) // Output: "Alice"
print(person2.name) // Output: "Bob"
- এখানে,
person1এবংperson2একে অপরের কপি হিসেবে তৈরি হয়েছে।person2তে পরিবর্তন করলেperson1তে কোনো প্রভাব পড়ে না, কারণ তারা দুটি আলাদা কপি।
মিউটেবল এবং ইমিউটেবল স্ট্রাক্ট
স্ট্রাক্টের প্রোপার্টি মিউটেবল (পরিবর্তনযোগ্য) হতে হলে স্ট্রাক্টটি একটি var ভেরিয়েবল হতে হবে এবং মেথডকে mutating হিসেবে চিহ্নিত করতে হবে।
struct Car {
var brand: String
var model: String
mutating func updateModel(newModel: String) {
model = newModel
}
}
var myCar = Car(brand: "Tesla", model: "Model S")
myCar.updateModel(newModel: "Model 3")
print(myCar.model) // Output: "Model 3"
- এখানে,
updateModelমেথডটিmutatingহিসেবে চিহ্নিত করা হয়েছে, কারণ এটি স্ট্রাক্টের প্রোপার্টি পরিবর্তন করছে।
স্ট্রাক্টের সাথে ইনিশিয়ালাইজার
Swift-এ স্ট্রাক্ট অটোমেটিকালি একটি মেম্বারওয়াইজ ইনিশিয়ালাইজার তৈরি করে, যা প্রতিটি প্রোপার্টির জন্য মান ইনিশিয়ালাইজ করতে পারে।
struct Rectangle {
var width: Double
var height: Double
}
// স্ট্রাক্ট থেকে অবজেক্ট তৈরি
let rect = Rectangle(width: 10.0, height: 5.0)
print("Width: \(rect.width), Height: \(rect.height)")
- এখানে,
Rectangleস্ট্রাক্টের জন্য কোনো কাস্টম ইনিশিয়ালাইজার তৈরি করা হয়নি, কিন্তু Swift অটোমেটিকালি একটি মেম্বারওয়াইজ ইনিশিয়ালাইজার তৈরি করেছে।
কাস্টম ইনিশিয়ালাইজার
স্ট্রাক্টে প্রোপার্টি ইনিশিয়ালাইজ করতে আমরা চাইলে কাস্টম ইনিশিয়ালাইজারও তৈরি করতে পারি।
struct Circle {
var radius: Double
var area: Double
init(radius: Double) {
self.radius = radius
self.area = 3.1416 * radius * radius
}
}
let myCircle = Circle(radius: 5.0)
print("Radius: \(myCircle.radius), Area: \(myCircle.area)")
- এখানে,
Circleস্ট্রাক্টে একটি কাস্টম ইনিশিয়ালাইজার ব্যবহার করা হয়েছে, যাradiusএবংareaপ্রোপার্টি ইনিশিয়ালাইজ করে।
স্ট্রাক্ট বনাম ক্লাস
| বৈশিষ্ট্য | স্ট্রাক্ট (Struct) | ক্লাস (Class) |
|---|---|---|
| টাইপ | ভ্যালু টাইপ | রেফারেন্স টাইপ |
| ইনহেরিটেন্স | ইনহেরিট করা যায় না | ইনহেরিট করা যায় |
| মেম্বারওয়াইজ ইনিশিয়ালাইজার | Swift অটোমেটিকালি তৈরি করে | তৈরি করতে হয় |
| ডি-ইনিশিয়ালাইজার | নেই | আছে (deinit) |
কখন স্ট্রাক্ট ব্যবহার করবেন?
- যখন আপনার ডেটা টাইপ ছোট এবং সহজ।
- যখন আপনি ভ্যালু টাইপ (কপি-বাই-ভ্যালু) আচরণ চান।
- যখন ইনহেরিটেন্স প্রয়োজন নেই।
- যখন আপনার টাইপের ইনক্যাপসুলেশন (data encapsulation) দরকার, কিন্তু অত্যন্ত জটিল নয়।
উপসংহার
Swift-এ স্ট্রাক্ট হলো একটি শক্তিশালী ডেটা স্ট্রাকচার, যা ক্লাসের মতো কাজ করতে পারে, তবে এটি ভ্যালু টাইপ হিসেবে কাজ করে এবং সাধারণত ছোট ও সাধারণ ডেটা মডেলের জন্য উপযুক্ত। স্ট্রাক্ট ব্যবহার করে প্রোগ্রামকে আরও সুসংগঠিত, পুনঃব্যবহারযোগ্য এবং কার্যকরী করা যায়।
Swift-এ ক্লাস (Class) এবং স্ট্রাক্ট (Struct) উভয়ই ডেটা এবং ফাংশনালিটির মডেলিং করতে ব্যবহৃত হয়। যদিও তাদের মধ্যে অনেক সাদৃশ্য রয়েছে, তাদের কাজ এবং ব্যবহারিক পার্থক্যও আছে। ক্লাস এবং স্ট্রাক্ট উভয়েই প্রোপার্টিজ (properties), মেথড (methods), ইনিশিয়ালাইজার (initializer) থাকতে পারে, কিন্তু তাদের কিছু গুরুত্বপূর্ণ পার্থক্য রয়েছে। নিচে ক্লাস এবং স্ট্রাক্টের মধ্যে প্রধান পার্থক্যগুলো ব্যাখ্যা করা হলো।
১. রেফারেন্স টাইপ বনাম ভ্যালু টাইপ
ক্লাস: ক্লাস হলো রেফারেন্স টাইপ। এটি মানের পরিবর্তে একটি রেফারেন্স বা পয়েন্টার সংরক্ষণ করে। যদি আপনি একটি ক্লাসের অবজেক্ট কপি করেন, তাহলে এটি একই অবজেক্টের রেফারেন্স শেয়ার করবে। এর ফলে একটি অবজেক্টের পরিবর্তন করলে অন্য কপিগুলিও পরিবর্তিত হবে।
স্ট্রাক্ট: স্ট্রাক্ট হলো ভ্যালু টাইপ। এটি মান কপি করে সংরক্ষণ করে। স্ট্রাক্টের একটি কপি তৈরি করলে এটি আসল অবজেক্টের সম্পূর্ণ কপি হয়। যদি একটি কপির মান পরিবর্তন করা হয়, তা অন্য কপিগুলিকে প্রভাবিত করে না।
উদাহরণ:
// ক্লাস উদাহরণ
class Person {
var name: String
init(name: String) {
self.name = name
}
}
let person1 = Person(name: "Alice")
let person2 = person1
person2.name = "Bob"
print(person1.name) // আউটপুট: Bob
এখানে, person2 এবং person1 একই রেফারেন্স শেয়ার করে। তাই person2-এ পরিবর্তন করলে person1-এও পরিবর্তন হয়েছে।
// স্ট্রাক্ট উদাহরণ
struct PersonStruct {
var name: String
}
var person3 = PersonStruct(name: "Alice")
var person4 = person3
person4.name = "Bob"
print(person3.name) // আউটপুট: Alice
এখানে, person3 এবং person4 আলাদা কপি। person4-এ পরিবর্তন করলে person3 অপরিবর্তিত থাকে।
২. ইনহেরিটেন্স (Inheritance)
- ক্লাস: ক্লাস ইনহেরিটেন্স সমর্থন করে, অর্থাৎ একটি ক্লাস অন্য একটি ক্লাস থেকে বৈশিষ্ট্য এবং মেথড উত্তরাধিকারী হতে পারে। এটি অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP) এর মূল বৈশিষ্ট্যগুলির মধ্যে একটি।
class Animal {
var name: String
init(name: String) {
self.name = name
}
func makeSound() {
print("Animal sound")
}
}
class Dog: Animal {
func bark() {
print("Woof!")
}
}
let dog = Dog(name: "Buddy")
dog.makeSound() // আউটপুট: Animal sound
dog.bark() // আউটপুট: Woof!
- স্ট্রাক্ট: স্ট্রাক্ট ইনহেরিটেন্স সমর্থন করে না। আপনি একটি স্ট্রাক্টকে অন্য স্ট্রাক্ট থেকে উত্তরাধিকারী করতে পারবেন না।
৩. ডিনিশিয়ালাইজার (Deinitializer)
- ক্লাস: ক্লাসে ডিনিশিয়ালাইজার (deinit) থাকতে পারে, যা অবজেক্ট মেমোরি থেকে সরানোর সময় স্বয়ংক্রিয়ভাবে কল হয়। এটি সাধারণত রিসোর্স রিলিজ করার জন্য ব্যবহৃত হয়।
class FileHandler {
var fileName: String
init(fileName: String) {
self.fileName = fileName
}
deinit {
print("\(fileName) is closed.")
}
}
- স্ট্রাক্ট: স্ট্রাক্টে ডিনিশিয়ালাইজার নেই। স্ট্রাক্ট ভ্যালু টাইপ হওয়ায়, যখন এর স্কোপ শেষ হয়, তখন এটি স্বয়ংক্রিয়ভাবে মেমোরি থেকে মুক্তি পায় এবং কোনো অতিরিক্ত ডিনিশিয়ালাইজেশনের প্রয়োজন হয় না।
৪. রেফারেন্স কাউন্টিং (ARC)
ক্লাস: ক্লাস অবজেক্টগুলিতে অটোমেটিক রেফারেন্স কাউন্টিং (ARC) প্রযোজ্য হয়, যা মেমোরি ম্যানেজমেন্টের জন্য দায়ী। ARC ট্র্যাক করে কতগুলি রেফারেন্স একটি ক্লাসের অবজেক্টের সাথে সংযুক্ত আছে এবং যখন কোনো রেফারেন্স থাকে না, তখন এটি মেমোরি থেকে অবজেক্টটি সরিয়ে দেয়।
স্ট্রাক্ট: স্ট্রাক্ট ভ্যালু টাইপ হওয়ায় এতে ARC প্রযোজ্য নয়। এটি স্বয়ংক্রিয়ভাবে মেমোরি থেকে মুক্তি পায়।
৫. মিউটেবল এবং ইমিউটেবল স্ট্রাকচার
ক্লাস: ক্লাস মিউটেবল হতে পারে, এমনকি যদি এটি কনস্ট্যান্ট (let) হিসাবে ডিফাইন করা হয়। আপনি এর প্রোপার্টিজ পরিবর্তন করতে পারেন।
স্ট্রাক্ট: স্ট্রাক্ট যদি কনস্ট্যান্ট (let) হিসেবে ডিফাইন করা হয়, তবে এর প্রোপার্টিজ পরিবর্তন করা যায় না। এর জন্য var ব্যবহার করতে হবে।
struct Car {
var model: String
}
var car1 = Car(model: "Toyota")
car1.model = "Honda" // এটি কাজ করবে
let car2 = Car(model: "Ford")
// car2.model = "Chevrolet" // এটি কাজ করবে না, কারণ car2 একটি কনস্ট্যান্ট।
৬. ক্লাস বনাম স্ট্রাক্টের ব্যবহারিক প্রয়োগ
ক্লাস ব্যবহার করা উচিত যখন:
- অবজেক্টগুলির মধ্যে রেফারেন্স শেয়ার করতে হয়।
- ইনহেরিটেন্স প্রয়োজন।
- মেমোরি ম্যানেজমেন্ট (ARC) দরকার।
- ডিনিশিয়ালাইজেশন প্রয়োজন।
স্ট্রাক্ট ব্যবহার করা উচিত যখন:
- ডেটা স্ট্রাকচারগুলি ছোট এবং লাইটওয়েট হয়।
- ডেটা কপি করে ব্যবহার করার প্রয়োজন হয়।
- ইমিউটেবল বা ভ্যালু-বেজড ডেটা স্ট্রাকচার প্রয়োজন।
উপসংহার
| বৈশিষ্ট্য | ক্লাস | স্ট্রাক্ট |
|---|---|---|
| টাইপ | রেফারেন্স টাইপ | ভ্যালু টাইপ |
| ইনহেরিটেন্স | সমর্থন করে | সমর্থন করে না |
| ডিনিশিয়ালাইজার | আছে (deinit) | নেই |
| রেফারেন্স কাউন্টিং (ARC) | প্রযোজ্য | প্রযোজ্য নয় |
| মিউটেবিলিটি | কনস্ট্যান্ট থাকলেও মিউটেবল হতে পারে | কনস্ট্যান্ট হলে ইমিউটেবল |
Swift-এ ক্লাস এবং স্ট্রাক্টের মধ্যে পার্থক্য বোঝা খুবই গুরুত্বপূর্ণ, কারণ এটি ডেটা এবং অবজেক্ট ম্যানেজমেন্টের সঠিক কৌশল নির্ধারণ করতে সাহায্য করে। প্রয়োজন অনুযায়ী এই দুইটি ডেটা টাইপ বেছে নিয়ে প্রোগ্রামিং করতে পারলে আপনার অ্যাপ্লিকেশন আরও কার্যকরী এবং মজবুত হবে।
Swift-এ এনাম (Enum) এবং এর ব্যবহার
Swift-এ এনাম (Enumeration বা Enum) হলো একটি ডেটা টাইপ যা একগুচ্ছ নির্দিষ্ট মান সংজ্ঞায়িত করে। এনাম সাধারণত এমন পরিস্থিতিতে ব্যবহৃত হয় যেখানে ভিন্ন ভিন্ন সম্ভাব্য মানের একটি নির্দিষ্ট তালিকা প্রয়োজন। এটি প্রোগ্রামের স্টেট, কন্ডিশন, বা অপশন নির্দেশ করতে ব্যবহৃত হয়।
এনাম ডিক্লেয়ারেশন
এনাম ডিক্লেয়ার করতে enum কীওয়ার্ড ব্যবহার করা হয়, এবং এর ভেতরে case দিয়ে প্রতিটি সম্ভাব্য মান নির্ধারণ করা হয়।
enum CompassDirection {
case north
case south
case east
case west
}
- এখানে
CompassDirectionনামের একটি এনাম রয়েছে, যা চারটি মান সংজ্ঞায়িত করে:.north,.south,.east, এবং.west।
এনাম ভেরিয়েবল ডিক্লেয়ার এবং ব্যবহার
var direction = CompassDirection.north
switch direction {
case .north:
print("Heading North")
case .south:
print("Heading South")
case .east:
print("Heading East")
case .west:
print("Heading West")
}
- এনাম ব্যবহারের সময় ডট নোটেশন (
.north) ব্যবহার করা যায়।
অ্যাসোসিয়েটেড ভ্যালুসমূহ
Swift-এ, এনাম প্রতিটি কেসের সাথে অ্যাসোসিয়েটেড ভ্যালু ধারণ করতে পারে। এটি ব্যবহার করে প্রতিটি কেসের সাথে অতিরিক্ত তথ্য যোগ করা যায়।
enum Barcode {
case upc(Int, Int, Int, Int)
case qrCode(String)
}
let productCode = Barcode.upc(8, 85909, 51226, 3)
- এখানে,
Barcodeএনামের দুটি কেস রয়েছে—একটিupcযা চারটিIntমান ধারণ করে এবং একটিqrCodeযা একটিStringধারণ করে।
র অ্যান্ড স্টোরড প্রপার্টি (Raw Value)
এনাম প্রত্যেকটি কেসে একটি raw value ধারণ করতে পারে, যা কেসগুলির ডিফল্ট ভ্যালু হিসেবে কাজ করে।
enum Planet: Int {
case mercury = 1, venus, earth, mars
}
let earthPosition = Planet.earth.rawValue // আউটপুট: 3
- এখানে,
Planetএনাম প্রতিটি কেসে একটি ইন্টিজার মান ধারণ করে।
এনামের সুবিধা
- কোড পাঠযোগ্যতা বাড়ায়: বিভিন্ন স্টেট বা অপশন পরিষ্কারভাবে বুঝতে সাহায্য করে।
- টাইপ সেফটি: নির্দিষ্ট মানের বাইরে অন্য কিছু সেট করা সম্ভব নয়, ফলে কমন বাগ প্রতিরোধ হয়।
- সংগঠিত ডেটা: এনাম ব্যবহার করে কোডে ডেটা স্ট্রাকচার করা সহজ হয়।
ব্যবহারিক উদাহরণ
enum LightState {
case red, yellow, green
}
func trafficSignal(state: LightState) {
switch state {
case .red:
print("Stop")
case .yellow:
print("Prepare to stop")
case .green:
print("Go")
}
}
trafficSignal(state: .red) // আউটপুট: "Stop"
সংক্ষেপে
Swift-এ এনাম ব্যবহার করে একগুচ্ছ নির্দিষ্ট মান সংজ্ঞায়িত করা যায়, যা প্রোগ্রামের স্টেট বা কন্ডিশন নির্দেশ করতে এবং টাইপ সেফটি বজায় রাখতে সাহায্য করে। এটি প্রোগ্রামের পাঠযোগ্যতা এবং সুরক্ষা বাড়ায়।
Swift-এ অ্যাসোসিয়েটেড ভ্যালু এবং রঅ ভ্যালু (Raw Value) হলো দুটি ধারণা, যা সাধারণত এনাম (Enum) এর সাথে ব্যবহৃত হয়। এগুলি এনামের প্রকার এবং ব্যবহার কনফিগার করতে সহায়ক। এনামের মাধ্যমে আমরা বিভিন্ন কেস ডিফাইন করতে পারি এবং প্রতিটি কেসের সাথে অতিরিক্ত ভ্যালু বা রঅ ভ্যালু যুক্ত করতে পারি। নিচে এই দুটি ধারণার বিস্তারিত আলোচনা করা হলো।
অ্যাসোসিয়েটেড ভ্যালু (Associated Values)
অ্যাসোসিয়েটেড ভ্যালু হলো এনামের প্রতিটি কেসের সাথে অতিরিক্ত ভ্যালু সংযুক্ত করার একটি পদ্ধতি। এটি একটি কেসকে আরও ডাইনামিক করে তোলে, কারণ প্রতিবার কেসটি ব্যবহার করা হলে একটি ভিন্ন ভ্যালু যুক্ত করা যায়। এটি স্ট্রাক্ট বা টাপল (Tuple) এর মতো বিভিন্ন ডেটা টাইপ ধারণ করতে পারে।
অ্যাসোসিয়েটেড ভ্যালুর উদাহরণ
enum Transportation {
case car(String, Int)
case bus(Int)
case bicycle
}
// Transportation এর একটি উদাহরণ তৈরি করা
let myCar = Transportation.car("Tesla", 4)
let myBus = Transportation.bus(50)
let myBicycle = Transportation.bicycle
// অ্যাসোসিয়েটেড ভ্যালু ব্যবহারের উদাহরণ
switch myCar {
case .car(let brand, let seats):
print("Car brand: \(brand), Seats: \(seats)")
case .bus(let capacity):
print("Bus capacity: \(capacity)")
case .bicycle:
print("It's a bicycle.")
}
- এখানে,
Transportationএনামে তিনটি কেস রয়েছে:car,bus, এবংbicycle।carকেসে একটি স্ট্রিং (ব্র্যান্ড) এবং একটি ইন্টিজার (সিট সংখ্যা) রয়েছে।busকেসে একটি ইন্টিজার (ধারণক্ষমতা) রয়েছে।bicycleকেসে কোনো অ্যাসোসিয়েটেড ভ্যালু নেই।
switchস্টেটমেন্ট ব্যবহার করে আমরা প্রতিটি কেসের সাথে যুক্ত অ্যাসোসিয়েটেড ভ্যালু বের করেছি।
অ্যাসোসিয়েটেড ভ্যালুর ব্যবহার
- একটি এনামের মাধ্যমে আপনি বিভিন্ন ধরনের ডেটা সংরক্ষণ করতে এবং প্রয়োজন অনুযায়ী ব্যবহার করতে পারবেন।
- এটি একাধিক ডেটা টাইপের তথ্য ধারণ করতে পারে, যা প্রোগ্রামিংয়ে ডাইনামিক এবং ফ্লেক্সিবল ব্যবহার নিশ্চিত করে।
রঅ ভ্যালু (Raw Value)
রঅ ভ্যালু হলো একটি এনামের প্রতিটি কেসের সাথে যুক্ত একটি পূর্বনির্ধারিত ভ্যালু। এটি সাধারণত স্ট্রিং, ইন্টিজার, বা অন্য কোনো নির্দিষ্ট টাইপের ভ্যালু হিসেবে থাকে এবং প্রতিটি কেসের জন্য একটি নির্দিষ্ট ভ্যালু নির্ধারণ করা হয়। রঅ ভ্যালু সেট করা হলে এনামের প্রতিটি কেস সেই নির্দিষ্ট টাইপের ভ্যালু পায়।
রঅ ভ্যালুর উদাহরণ
enum Direction: String {
case north = "North"
case south = "South"
case east = "East"
case west = "West"
}
// রঅ ভ্যালু অ্যাক্সেস করা
let direction = Direction.north
print(direction.rawValue) // Output: "North"
- এখানে,
Directionএনামে চারটি কেস রয়েছে:north,south,east, এবংwest। প্রতিটি কেসের জন্য একটি স্ট্রিং রঅ ভ্যালু নির্ধারণ করা হয়েছে। direction.rawValueদিয়ে আমরাnorthকেসের রঅ ভ্যালু বের করেছি, যা"North"।
রঅ(Raw) ভ্যালুর অন্য উদাহরণ: ইন্টিজার টাইপ
enum StatusCode: Int {
case success = 200
case notFound = 404
case serverError = 500
}
let code = StatusCode.notFound
print(code.rawValue) // Output: 404
- এখানে,
StatusCodeএনামে ইন্টিজার টাইপ রঅ ভ্যালু নির্ধারণ করা হয়েছে, যা প্রতিটি কেসের জন্য একটি নির্দিষ্ট মান ধারণ করে।
রঅ ভ্যালু এবং অ্যাসোসিয়েটেড ভ্যালুর পার্থক্য
| বৈশিষ্ট্য | রঅ ভ্যালু (Raw Value) | অ্যাসোসিয়েটেড ভ্যালু (Associated Value) |
|---|---|---|
| টাইপ | একটি নির্দিষ্ট টাইপ হতে হবে (যেমন, স্ট্রিং বা ইন্টিজার) | যেকোনো টাইপ হতে পারে এবং ভিন্ন ভিন্ন ভ্যালু ধারণ করতে পারে। |
| ফিক্সড ভ্যালু | প্রতিটি কেসের জন্য পূর্বনির্ধারিত এবং স্থির থাকে। | প্রতিবার ব্যবহার করার সময় কেসের জন্য ভিন্ন ভিন্ন ভ্যালু থাকতে পারে। |
| প্রাথমিক ব্যবহার | সহজভাবে কেসের সাথে একটি মান অ্যাসাইন করা। | ডাইনামিক ডেটা সংরক্ষণ বা কেসের সাথে অতিরিক্ত তথ্য যুক্ত করা। |
রঅ ভ্যালু ব্যবহার করে ইনিশিয়ালাইজেশন
Swift-এ আপনি রঅ ভ্যালুর মাধ্যমে এনামের একটি কেস ইনিশিয়ালাইজ করতে পারেন, যদি সেই রঅ ভ্যালু সেই কেসের সাথে মিলে যায়।
if let direction = Direction(rawValue: "East") {
print("The direction is \(direction).") // Output: "The direction is east."
} else {
print("Invalid direction")
}
- এখানে,
"East"রঅ ভ্যালু দিয়েDirectionএনামের একটি ইনস্ট্যান্স তৈরি করা হয়েছে।
উপসংহার
Swift-এ অ্যাসোসিয়েটেড ভ্যালু এবং রঅ ভ্যালু দুটি ভিন্নভাবে এনাম ব্যবহারের জন্য সুবিধা প্রদান করে:
- অ্যাসোসিয়েটেড ভ্যালু: ডাইনামিক ডেটা সংরক্ষণ এবং ব্যবহারের জন্য উপযোগী, যা একটি কেসের সাথে অতিরিক্ত তথ্য সংযুক্ত করতে পারে।
- রঅ ভ্যালু: প্রতিটি কেসের জন্য নির্দিষ্ট এবং পূর্বনির্ধারিত মান নির্ধারণ করতে এবং সহজে তা অ্যাক্সেস করতে সহায়ক।
এই দুটি ধারণা Swift-এ এনাম ব্যবহারের ক্ষমতা বাড়িয়ে তোলে এবং প্রোগ্রামিংয়ে এনামের ব্যবহার আরও কার্যকর এবং ফ্লেক্সিবল করে তোলে।
Read more