Class হলো Swift ভাষায় একটি রেফারেন্স টাইপ (reference type), যার ইনস্ট্যান্সগুলি অ্যাসাইনমেন্টের সময় কপি হওয়ার পরিবর্তে রেফারেন্স দ্বারা পাস করা হয়। structs-এর বিপরীতে, ক্লাসগুলি ইনহেরিটেন্স, ডিইনিশিয়ালাইজেশন এবং মেমোরি ব্যবস্থাপনার জন্য স্বয়ংক্রিয় রেফারেন্স কাউন্টিং ARC সমর্থন করে। Swift Programming Language Guide, 2026 অনুসারে, Apple-এর UI ফ্রেমওয়ার্ক (UIKit, AppKit) নিয়ে কাজ করতে এবং অবজেক্টের শেয়ার্ড আইডেন্টিটি প্রয়োজন এমন প্যাটার্ন বাস্তবায়নের জন্য class প্রয়োজনীয়। class এবং struct-এর মধ্যে নির্বাচন Swift-এর মূল আর্কিটেকচারাল সিদ্ধান্তগুলির মধ্যে একটি।
মূল পয়েন্ট
Class — Swift-এ একটি যৌগিক রেফারেন্স টাইপ যা প্রপার্টি এবং মেথডকে ইনহেরিটেন্সและ ডায়নামিক ডিসপ্যাচ的支持 সহ একটি সত্তায় গ্রুপ করে। struct-এর বিপরীতে, একটি ক্লাস ইনস্ট্যান্স হিপে তৈরি হয় এবং একটি ভেরিয়েবল এই ইনস্ট্যান্সের একটি রেফারেন্স সংরক্ষণ করে, ডেটা নিজেই নয়।
যখন আপনি একটি ক্লাস ভেরিয়েবলকে অন্য ভেরিয়েবলে অ্যাসাইন করেন, উভয়ই মেমোরিতে একই অবজেক্টকে রেফারেন্স করে। একটি রেফারেন্সের মাধ্যমে পরিবর্তন অন্যটির মাধ্যমে দৃশ্যমান হয় — এটি রেফারেন্স টাইপের একটি মৌলিক বৈশিষ্ট্য, যা ডেলিগেশন, অবজার্ভেশন এবং শেয়ার্ড স্টেট প্যাটার্নে ব্যবহৃত হয়।
Apple Swift ডকুমেন্টেশন অনুসারে, UIKit এবং AppKit-এর সাথে কাজ করার একমাত্র উপায় ক্লাস, যেখানে সমস্ত UI কম্পোনেন্ট UIView এবং UIViewController থেকে ইনহেরিট করে। অতিরিক্তভাবে, ক্লাসগুলি সেই প্যাটার্নগুলি বাস্তবায়নের জন্য প্রয়োজনীয় যেখানে অবজেক্ট আইডেন্টিটি (একটি অবজেক্টের দুটি রেফারেন্স) এবং নিয়ন্ত্রিত লাইফটাইম প্রয়োজন।
রেফারেন্স টাইপ সিম্যান্টিক্স — ক্লাসের মূল বৈশিষ্ট্য। একটি ক্লাসকে নতুন ভেরিয়েবলে অ্যাসাইন করার সময়, Swift রেফারেন্স কপি করে, ডেটা নয়। একই ইনস্ট্যান্সকে রেফারেন্স করা সমস্ত ভেরিয়েবল এর বর্তমান অবস্থা দেখে এবং এটি পরিবর্তন করতে পারে। এই আচরণ ভ্যালু টাইপ থেকে মৌলিকভাবে আলাদা, যেখানে প্রতিটি ভেরিয়েবল একটি স্বাধীন কপি পায়।
// রেফারেন্স টাইপ সিম্যান্টিক্সের উদাহরণ
class User {
var name: String
init(name: String) { self.name = name }
}
let user1 = User(name: "Alice")
let user2 = user1 // user2 — একই রেফারেন্স
user2.name = "Bob"
print(user1.name) // "Bob" — user2-এর মাধ্যমে পরিবর্তিত!
// === অপারেটর দিয়ে আইডেন্টিটি চেক
print(user1 === user2) // true — একই অবজেক্ট
=== (আইডেন্টিটি) এবং !== অপারেটর চেক করে যে দুটি ভেরিয়েবল একই ক্লাস ইনস্ট্যান্সকে রেফারেন্স করে কিনা। এটি == (সমতা) থেকে আলাদা, যা প্রপার্টি মান তুলনা করে। === অপারেটর struct-এর জন্য উপলব্ধ নয় — ভ্যালু টাইপের কোনো আইডেন্টিটি নেই।
ইনহেরিটেন্স — একটি প্রক্রিয়া যার মাধ্যমে একটি ক্লাস প্যারেন্ট ক্লাসের প্রপার্টি এবং মেথড গ্রহণ করতে পারে। Swift-এ, একটি ক্লাস শুধুমাত্র একটি প্যারেন্ট থেকে ইনহেরিট করতে পারে (একক ইনহেরিটেন্স), তবে একাধিক প্রোটোকল বাস্তবায়ন করতে পারে। override কীওয়ার্ড ইনহেরিটেড মেথড বা প্রপার্টি ওভাররাইড করার অনুমতি দেয়।
যে কোনো ক্লাস যা অন্য ক্লাস থেকে ইনহেরিট করে না, স্বয়ংক্রিয়ভাবে বেস হয়ে যায় (NSObject-এর সাথে গুলিয়ে ফেলবেন না)। একটি সাবক্লাস তার নামের পরে কোলন দিয়ে প্যারেন্ট নির্দিষ্ট করে। যদি একটি সাবক্লাস প্যারেন্টের মেথড ওভাররাইড করে, তবে তাকে প্যারেন্টের আচরণ সংরক্ষণের জন্য super.method() কল করতে হবে — এটি কম্পাইলারের প্রয়োজনীয়তা।
class-এর আগে কীওয়ার্ড final ইনহেরিটেন্স প্রতিরোধ করে। কম্পাইলার স্ট্যাটিক ডিসপ্যাচের মাধ্যমে ফাইনাল ক্লাসের মেথড কল অপ্টিমাইজ করতে পারে, যা কর্মক্ষমতা উন্নত করে। এক্সটেনশনের জন্য নয় এমন ক্লাসের জন্য final ব্যবহার করুন — এটি আপনার উদ্দেশ্য ডকুমেন্ট করে এবং কোড দ্রুত করে।
// Swift-এ ক্লাস ইনহেরিটেন্সের উদাহরণ
class Vehicle {
var speed: Double = 0
func description() -> String {
"Speed: \(speed) km/h"
}
}
// Car, Vehicle থেকে ইনহেরিট করে
class Car: Vehicle {
var brand: String = "Unknown"
override func description() -> String {
"\(brand) - \(speed) km/h"
}
}
// ফাইনাল ক্লাস — ইনহেরিটেন্স প্রতিরোধ করে
final class ElectricCar: Car {
var batteryLevel: Double = 100
}
let tesla = ElectricCar()
tesla.brand = "Tesla"
tesla.speed = 120
print(tesla.description()) // "Tesla - 120.0 km/h"
ইনহেরিটেন্স একটি শক্তিশালী কিন্তু দায়িত্বশীল প্রক্রিয়া। গভীর শ্রেণিবিন্যাস (5+ স্তর) রক্ষণাবেক্ষণ এবং পরীক্ষা জটিল করে তোলে। ইনহেরিটেন্স ছাড়া কার্যকরী পুনঃব্যবহারের জন্য, এক্সটেনশন এবং প্রোটোকল-ওরিয়েন্টেড প্রোগ্রামিং সহ প্রোটোকল ব্যবহার করুন — একটি পদ্ধতি যা Apple গভীর ক্লাস শ্রেণিবিন্যাসের বিকল্প হিসেবে প্রচার করে।
Swift ক্লাস মেমোরি ব্যবস্থাপনার জন্য ARC (স্বয়ংক্রিয় রেফারেন্স কাউন্টিং) ব্যবহার করে। প্রতিটি ক্লাস ইনস্ট্যান্সের একটি শক্তিশালী রেফারেন্স কাউন্টার থাকে। যখন একটি নতুন শক্তিশালী রেফারেন্স তৈরি হয়, কাউন্টার বাড়ে; যখন ধ্বংস হয়, কমে। যখন কাউন্টার শূন্যে পৌঁছায়, মেমোরি মুক্ত হয়।
Deinit — একটি মেথড যা ক্লাস ইনস্ট্যান্স মুক্ত হওয়ার আগে স্বয়ংক্রিয়ভাবে কল করা হয়। এটি রিসোর্স মুক্ত করে: ফাইল বন্ধ করে, নোটিফিকেশন থেকে সাবস্ক্রিপশন বাতিল করে, টাইমার বন্ধ করে। Deinit শুধুমাত্র ক্লাসের জন্য উপলব্ধ — structs এবং enums-এ এটি নেই।
শক্তিশালী রেফারেন্স চক্র (retain cycles) প্রতিরোধ করতে, Swift weak এবং unowned রেফারেন্স প্রদান করে। Weak একটি ঐচ্ছিক রেফারেন্স যা অবজেক্ট মুক্ত হলে স্বয়ংক্রিয়ভাবে nil হয়। Unowned অ-ঐচ্ছিক কিন্তু এমন একটি অবজেক্টকে রেফারেন্স করে যা বর্তমান প্রসঙ্গের চেয়ে বেশি দিন বাঁচার নিশ্চয়তা দেয়। একটি সাধারণ retain cycle প্যারেন্ট-চাইল্ড সম্পর্কে ঘটে: চাইল্ড প্যারেন্টের জন্য একটি শক্তিশালী রেফারেন্স রাখে।
// ARC এবং দুর্বল রেফারেন্সের উদাহরণ
class Parent {
var name: String
var child: Child?
init(name: String) { self.name = name }
deinit { print("\(name) মুক্ত হয়েছে") }
}
class Child {
var name: String
weak var parent: Parent? // weak retain cycle প্রতিরোধ করে
init(name: String) { self.name = name }
deinit { print("\(name) মুক্ত হয়েছে") }
}
var parent: Parent? = Parent(name: "Anna")
parent?.child = Child(name: "Mia")
parent?.child?.parent = parent
parent = nil // দুটি অবজেক্টই মুক্ত!
// weak ছাড়া এটি retain cycle তৈরি করবে
চাইল্ড অবজেক্ট থেকে প্যারেন্টে রেফারেন্স এবং ক্লোজারে ক্যাপচার তালিকার জন্য সর্বদা weak ব্যবহার করুন। Unowned শুধুমাত্র তখনই ব্যবহার করুন যখন আপনি নিশ্চিত যে অবজেক্টটি বর্তমান প্রসঙ্গের চেয়ে বেশি দিন বাঁচবে — unowned-এর ভুল ব্যবহার মুক্ত মেমোরিতে অ্যাক্সেস করার সময় ক্র্যাশ হতে পারে।
class এবং struct-এর মধ্যে নির্বাচন একটি আর্কিটেকচারাল সিদ্ধান্ত যা কর্মক্ষমতা, থ্রেড নিরাপত্তা এবং API ডিজাইনকে প্রভাবিত করে। প্রতিটি ক্ষেত্রে সঠিক সিদ্ধান্ত নিতে মূল পার্থক্যের সারণী বিবেচনা করুন।
| বৈশিষ্ট্য | class | struct |
|---|---|---|
| টাইপ | রেফারেন্স টাইপ | ভ্যালু টাইপ (কপি) |
| মেমোরি | হিপ + ARC | স্ট্যাক / ইনলাইনড |
| ইনহেরিটেন্স | সমর্থন করে (এক প্যারেন্ট) | সমর্থন করে না |
| Deinit | উপলব্ধ | উপলব্ধ নয় |
| আইডেন্টিটি (===) | সমর্থন করে | সমর্থন করে না |
| Mutating | প্রয়োজন নেই (সর্বদা mutating) | শুধুমাত্র mutating-এর সাথে |
| Memberwise init | উত্পন্ন হয় না | স্বয়ংক্রিয়ভাবে উত্পন্ন হয় |
| থ্রেড নিরাপত্তা | নিশ্চিত নয় (শেয়ার্ড স্টেট) | নিশ্চিত (কপি করা) |
ক্লাস ব্যবহার করুন যখন আপনার শেয়ার্ড আইডেন্টিটি (কোডের একাধিক অংশ একটি অবজেক্ট নিয়ে কাজ করা), ইনহেরিটেন্স বা Objective-C runtime-এর সাথে ইন্টারঅ্যাকশন প্রয়োজন। বাকি সবকিছুর জন্য, structs পছন্দ করা হয় — এগুলি দ্রুততর, মাল্টিথ্রেডেড কোডে নিরাপদ এবং মেমোরি ব্যবস্থাপনার প্রয়োজন হয় না।
ডিফল্টরূপে struct ব্যবহার করার Apple-এর সুপারিশ সত্ত্বেও, বেশ কয়েকটি নির্দিষ্ট পরিস্থিতিতে ক্লাস প্রয়োজনীয়। আসুন ব্যবহারিক উদাহরণ সহ প্রতিটি পরীক্ষা করি।
iOS এবং macOS-এর সমস্ত UI কম্পোনেন্ট হল ক্লাস যা UIView (iOS) বা NSView (macOS) থেকে ইনহেরিট করে। আপনি UIViewController-কে struct দিয়ে প্রতিস্থাপন করতে পারবেন না — এটি রিসোর্স মুক্ত করার জন্য ইনহেরিটেন্স এবং deinit প্রয়োজন। UIKit নিয়ে কাজ করার সময়, কন্ট্রোলার, ভিউ এবং তাদের ডেলিগেটের জন্য ক্লাস ব্যবহার করুন।
সিঙ্গেলটন প্যাটার্ন (সম্পূর্ণ অ্যাপ্লিকেশনের জন্য একটি ক্লাস ইনস্ট্যান্স) রেফারেন্স সিম্যান্টিক্স প্রয়োজন। ম্যানেজার: NetworkManager, SettingsManager, AnalyticsService — সাধারণত একটি শেয়ার্ড স্ট্যাটিক প্রপার্টি সহ ক্লাস হিসাবে বাস্তবায়িত হয়। Structs উপযুক্ত নয় কারণ প্রতিটি কপি একটি স্বাধীন ইনস্ট্যান্স হবে।
যখন একটি অবজেক্টকে সত্যের একক উৎস হতে হয় এবং মডিউলের মধ্যে রেফারেন্স দ্বারা পাস করা হয় — class ব্যবহার করুন। এটি স্টেট ম্যানেজমেন্টের ক্ষেত্রে প্রযোজ্য, যেখানে একটি জায়গায় অবজেক্ট পরিবর্তন করা সমস্ত নির্ভরশীল কম্পোনেন্টে দৃশ্যমান হতে হবে। SwiftUI-তে ObservableObject-এর জন্য, ক্লাস বাধ্যতামূলক।
// ObservableObject — SwiftUI-এর জন্য class প্রয়োজনীয়
import SwiftUI
class AppViewModel: ObservableObject {
@Published var isLoggedIn: Bool = false
@Published var username: String = ""
func login(user: String) {
isLoggedIn = true
username = user
}
}
// SwiftUI View-তে ব্যবহার
struct ContentView: View {
@StateObject var viewModel = AppViewModel()
var body: some View {
Text(viewModel.isLoggedIn ? "স্বাগতম" : "লগইন")
}
}
নিয়ম: যদি একটি অবজেক্টের আইডেন্টিটি (দুটি রেফারেন্স -> একটি অবজেক্ট) থাকতে হয়, একটি একক ইনস্ট্যান্স হতে হয়, বা UIKit/Objective-C-এর সাথে কাজ করতে হয় — class বেছে নিন। যদি একটি অবজেক্ট কেবল ডেটা ধারণ করে — struct বেছে নিন।
সচরাচর জিজ্ঞাসিত প্রশ্ন
Class Swift-এ একটি রেফারেন্স টাইপ যা ইনহেরিটেন্স, ডিইনিশিয়ালাইজেশন এবং মেমোরি ব্যবস্থাপনার জন্য ARC সমর্থন করে। ক্লাস ইনস্ট্যান্স হিপে সংরক্ষিত হয় এবং ভেরিয়েবলে অবজেক্টের একটি রেফারেন্স থাকে, তার কপি নয়।
Class — রেফারেন্স টাইপ (রেফারেন্স দ্বারা পাস করা হয়), ইনহেরিটেন্স এবং deinit সমর্থন করে। Struct — ভ্যালু টাইপ (কপি করা হয়), ইনহেরিটেন্স সমর্থন করে না, কিন্তু প্রোটোকল বাস্তবায়ন করে এবং স্বয়ংক্রিয়ভাবে memberwise init পায়। Swift ডিফল্ট টাইপ হিসাবে struct সুপারিশ করে।
ARC (স্বয়ংক্রিয় রেফারেন্স কাউন্টিং) — Swift ক্লাসের জন্য মেমোরি ব্যবস্থাপনা প্রক্রিয়া। প্রতিটি ইনস্ট্যান্সের একটি শক্তিশালী রেফারেন্স কাউন্টার থাকে। যখন কাউন্টার শূন্যে পৌঁছায়, মেমোরি মুক্ত হয়। weak এবং unowned রেফারেন্স অবজেক্টের মধ্যে retain cycles প্রতিরোধ করে।
Deinit — একটি ক্লাস মেথড যা তার মেমোরি মুক্ত হওয়ার আগে স্বয়ংক্রিয়ভাবে কল করা হয়। ফাইল বন্ধ করা, নোটিফিকেশন থেকে সাবস্ক্রিপশন বাতিল করা এবং অন্যান্য পরিষ্কার করার কাজে ব্যবহৃত হয়। Deinit শুধুমাত্র ক্লাসে উপলব্ধ — structs-এ এটি নেই।
UIKit/AppKit UI কম্পোনেন্ট, সিঙ্গেলটন, SwiftUI-তে ObservableObject, শেয়ার্ড আইডেন্টিটি সহ অবজেক্ট (delegate, observer) এবং Objective-C runtime-এর সাথে কাজ করার সময় class ব্যবহার করুন। ডেটা মডেল, DTO এবং কনফিগারেশনের জন্য, struct পছন্দ করা হয়।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন