Struct হল Swift ভাষায় একটি ভ্যালু টাইপ (value type), যার ইনস্ট্যান্সগুলি কোডের বিভিন্ন অংশের মধ্যে পাস করার সময় কপি করা হয়। ক্লাসের বিপরীতে, কাঠামোগুলি ইনহেরিটেন্স সমর্থন করে না, তবে তারা প্রোটোকল প্রয়োগ করে, প্রপার্টি এবং মেথড ধারণ করে এবং ARC ছাড়াই পূর্বানুমানযোগ্য মেমরি ব্যবস্থাপনা প্রদান করে। Swift Programming Language Guide, 2026 অনুসারে, struct হল Swift-এর মৌলিক বিল্ডিং ব্লক — এমনকি স্ট্যান্ডার্ড টাইপ Int, String, Array এবং Dictionary কাঠামো হিসেবে প্রয়োগ করা হয়েছে। ভাষা ডেটা মডেলিংয়ের জন্য কাঠামোকে অগ্রাধিকার পছন্দ হিসেবে সুপারিশ করে।
মূল পয়েন্ট
Struct (কাঠামো) হল Swift-এ একটি যৌগিক ডেটা টাইপ যা সম্পর্কিত প্রপার্টি এবং মেথডকে একটি একক সত্তায় গ্রুপ করে। ক্লাসের বিপরীতে, কাঠামোগুলি value types: একটি ফাংশনে পাস করার বা নতুন ভেরিয়েবলে অ্যাসাইন করার সময়, মূল অবজেক্টের রেফারেন্সের পরিবর্তে কাঠামোর একটি স্বাধীন কপি তৈরি হয়।
Swift সমস্ত আদিম টাইপের জন্য কাঠামো ব্যবহার করে: Int, Double, String, Bool, Array, Dictionary এবং Set। এর মানে হল যে একটি সাধারণ Int-ও কাঠামোর মতো আচরণ করে — অ্যাসাইনমেন্টে একটি কপি তৈরি হয়। ডেভেলপার প্রপার্টি এবং মেথডের যেকোনো সেটসহ নিজস্ব কাঠামো সংজ্ঞায়িত করতে পারেন।
Swift Evolution (SE-0143) অনুসারে, স্ট্যান্ডার্ড টাইপগুলিকে কাঠামো হিসেবে প্রয়োগ করার সিদ্ধান্ত পারফরম্যান্স এবং পূর্বানুমানযোগ্যতার কারণে। Value types রেফারেন্স সাইকেল তৈরি করে না, ARC রেফারেন্স কাউন্টিংয়ের প্রয়োজন হয় না এবং গ্যারান্টি দেয় যে একটি কপি পরিবর্তন করলে মূল প্রভাবিত হবে না — এটি মাল্টিথ্রেডেড পরিস্থিতিতে ডেটা অপরিবর্তনীয়তার জন্য অত্যন্ত গুরুত্বপূর্ণ।
Value type সিম্যান্টিক্স হল struct এবং class-এর মধ্যে মূল পার্থক্য। যখন আপনি একটি কাঠামোকে নতুন ভেরিয়েবলে অ্যাসাইন করেন বা একটি ফাংশনে পাস করেন, Swift সমস্ত ডেটার একটি স্বাধীন কপি তৈরি করে। কপিতে করা যেকোনো পরিবর্তন মূলকে প্রভাবিত করে না, যা রেফারেন্স টাইপের সাধারণ পার্শ্বপ্রতিক্রিয়াগুলি দূর করে।
// ভ্যালু টাইপ সিম্যান্টিক্সের উদাহরণ
struct Point {
var x: Double
var y: Double
}
var p1 = Point(x: 10, y: 20)
var p2 = p1 // p2 হল p1-এর একটি স্বাধীন কপি
p2.x = 99 // শুধুমাত্র p2 পরিবর্তন হয়
print(p1.x) // 10 — p1 অপরিবর্তিত
print(p2.x) // 99
Swift কপি অপটিমাইজ করার জন্য Copy-on-Write (COW) ব্যবহার করে। যদি একাধিক ভেরিয়েবল একই কাঠামোকে রেফারেন্স করে কিন্তু তাদের কেউ ডেটা পরিবর্তন না করে, তাহলে কোন প্রকৃত কপি হয় না। Swift প্রথম মিউটেশন পর্যন্ত ভেরিয়েবলগুলির মধ্যে মেমরি ভাগ করে — তখন একটি প্রকৃত কপি তৈরি হয়। এটি অতিরিক্ত অ্যালোকেট অপারেশন প্রতিরোধ করে এবং কালেকশনের সাথে কাজ দ্রুত করে।
ডিফল্টভাবে, কাঠামোর মেথডগুলি এর প্রপার্টি পরিবর্তন করতে পারে না — Swift-এর পরিবর্তনকারী মেথডগুলির জন্য স্পষ্ট mutating কিওয়ার্ড প্রয়োজন। এই সীমাবদ্ধতা আকস্মিক মিউটেশন থেকে রক্ষা করে এবং কোডকে পূর্বানুমানযোগ্য করে: যদি একটি মেথড mutating হিসেবে চিহ্নিত না থাকে, তাহলে আপনি নিশ্চিত যে কাঠামো পরিবর্তন করবেন না।
যখন আপনি একটি মেথডের আগে mutating কিওয়ার্ড যোগ করেন, Swift কাঠামোর প্রপার্টিতে নতুন মান লেখার ক্ষমতা পায়। আসলে, মেথডটি self = এর মাধ্যমে কাঠামো ইনস্ট্যান্সকে সম্পূর্ণ নতুন দিয়ে প্রতিস্থাপনও করতে পারে। এই প্রক্রিয়াটি, উদাহরণস্বরূপ, Option এবং Result টাইপে ব্যবহৃত হয়।
// Mutating মেথডসহ struct
struct Counter {
private var value: Int = 0
// Mutating মেথড — প্রপার্টি পরিবর্তন করতে পারে
mutating func increment() {
value += 1
}
// Mutating মেথড সম্পূর্ণ self প্রতিস্থাপন করতে পারে
mutating func reset() {
self = Counter()
}
// নন-mutating মেথড — শুধুমাত্র পড়া
func currentValue() -> Int {
return value
}
}
var counter = Counter()
counter.increment()
print(counter.currentValue()) // 1
counter.reset()
print(counter.currentValue()) // 0
Mutating-এর নিয়ম: কাঠামোটি var দিয়ে ঘোষণা করতে হবে, let দিয়ে নয় — একটি ধ্রুবক কাঠামো mutating মেথড কল করতে পারে না। কম্পাইলার বিল্ড টাইমে এটি পরীক্ষা করে: let-ধ্রুবকে mutating মেথড কল করার চেষ্টা কম্পাইলেশন ত্রুটির কারণ হবে।
struct এবং class-এর মধ্যে পছন্দ Swift-এর মৌলিক সিদ্ধান্তগুলির মধ্যে একটি। উভয় টাইপেই প্রপার্টি, মেথড, ইনিশিয়ালাইজার থাকতে পারে এবং প্রোটোকল প্রয়োগ করতে পারে, তবে মেমরি সিম্যান্টিক্স, ইনহেরিটেন্স এবং লাইফসাইকেল ব্যবস্থাপনায় মৌলিক পার্থক্য রয়েছে।
| বৈশিষ্ট্য | struct | class |
|---|---|---|
| টাইপ | Value type (কপি হয়) | Reference type (রেফারেন্স) |
| ইনহেরিটেন্স | সমর্থন করে না | সমর্থন করে |
| ARC / রেফারেন্স কাউন্টিং | প্রয়োজন নেই | ARC প্রয়োজন |
| ডিইনিশিয়ালাইজেশন | সমর্থন করে না | deinit সমর্থন করে |
| ধ্রুবকে প্রপার্টি পরিবর্তন | শুধুমাত্র var-এর মাধ্যমে | let-এর মাধ্যমে সম্ভব (রেফারেন্স ধ্রুবক) |
| টাইপ কাস্টিং | সমর্থন করে না | সমর্থন করে |
| কালেকশনে সংরক্ষণ | সরাসরি সংরক্ষিত (মান) | রেফারেন্স হিসেবে সংরক্ষিত (পয়েন্টার) |
কাঠামোগুলি তখন পছন্দনীয় যখন ডেটা ইনহেরিটেন্সের প্রয়োজন না, শেয়ারড আইডেন্টিটি থাকা উচিত নয় (যেমন, স্থানাঙ্ক, আকার, কনফিগারেশন) এবং মডিউলের মধ্যে পাস করা হয়। UI কম্পোনেন্ট (UIView, UIViewController), সিংগলটন এবং শেয়ারড আইডেন্টিটি আছে এমন অবজেক্টের জন্য ক্লাস বেছে নেওয়া হয়।
Apple Swift-এ ডেটা মডেলিংয়ের জন্য struct কে ডিফল্ট টাইপ হিসেবে ব্যবহার করার সুপারিশ করে। কাঠামোগুলি পূর্বানুমানযোগ্য কপি সিম্যান্টিক্স এবং রেফারেন্স কাউন্টিংয়ের ওভারহেডের অনুপস্থিতির কারণে বেশিরভাগ পরিস্থিতির জন্য উপযুক্ত। চলুন সাধারণ ক্ষেত্রে দেখি যেখানে struct সর্বোত্তম পছন্দ।
যদি কোনো সত্তায় ইনহেরিটেন্সের প্রয়োজন ছাড়াই ডেটা থাকে (Product, User, Order, Point), তাহলে struct ব্যবহার করুন। কম্পাইলার স্বয়ংক্রিয়ভাবে memberwise initializer তৈরি করে — আপনাকে ম্যানুয়ালি init লিখতে হবে না। Equatable এবং Hashable-ও স্বয়ংক্রিয়ভাবে প্রয়োগ হয় সেই কাঠামোগুলির জন্য যাদের সব প্রপার্টি এই প্রোটোকলগুলি মেনে চলে।
কনফিগারেশন, সেটিংস এবং ফ্ল্যাগের জন্য যা তৈরি হওয়ার পরে পরিবর্তন হয় না, struct class-এর চেয়ে ভাল। একটি ধ্রুবক (let) কাঠামো সমস্ত নেস্টেড ফিল্ডের অপরিবর্তনীয়তা নিশ্চিত করে — class-এ এটি শুধুমাত্র রেফারেন্সের ক্ষেত্রে প্রযোজ্য, অবজেক্টের বিষয়বস্তুর ক্ষেত্রে নয়।
ভ্যালু সিম্যান্টিক্সের কারণে মাল্টিথ্রেডেড পরিবেশে কাঠামোগুলি নিরাপদ। প্রতিটি থ্রেড ডেটার একটি স্বাধীন কপি পায় এবং অন্যান্য থ্রেডকে প্রভাবিত করে না। Value types-এর জন্য থ্রেডগুলির মধ্যে ডেটা রেস অসম্ভব, যা SwiftUI-তে মডেলের জন্য struct-কে পছন্দের বিকল্প করে (ObservableObject-এর জন্য class প্রয়োজন, কিন্তু @State struct ব্যবহার করে)।
// ডেটা মডেলের জন্য struct ব্যবহারের উদাহরণ
struct User: Codable, Identifiable {
let id: UUID
var name: String
var email: String
var isPremium: Bool
// গণনাকৃত প্রপার্টি — non-mutating
var displayName: String {
isPremium ? "\(name) ⭐️" : name
}
}
// স্বয়ংক্রিয় memberwise ইনিশিয়ালাইজার
let user = User(
id: UUID(),
name: "Alice",
email: "alice@example.com",
isPremium: true
)
// মাল্টি-থ্রেডিংয়ের জন্য কপি করা নিরাপদ
var userCopy = user
userCopy.isPremium = false
// user.isPremium true থাকে
class ব্যবহার করুন যখন আপনার ইনহেরিটেন্স (UIKit/AppKit কম্পোনেন্ট), শেয়ারড আইডেন্টিটি (delegate, observer) বা নিয়ন্ত্রিত অবজেক্ট লাইফসাইকেল (deinit) প্রয়োজন। বাকি সবকিছুর জন্য — struct ব্যবহার করুন।
সচরাচর জিজ্ঞাসিত প্রশ্ন
Struct Swift-এ একটি ভ্যালু টাইপ যা কোডের অংশগুলির মধ্যে পাস করার সময় কপি হয়। কাঠামোগুলিতে প্রপার্টি, মেথড, ইনিশিয়ালাইজার থাকতে পারে এবং প্রোটোকল প্রয়োগ করতে পারে। Swift-এর মৌলিক টাইপগুলি (Int, String, Array) কাঠামো হিসেবে প্রয়োগ করা হয়েছে।
Struct একটি value type (অ্যাসাইনমেন্টে কপি হয়), ইনহেরিটেন্স সমর্থন করে না এবং ARC প্রয়োজন নেই। Class একটি reference type (রেফারেন্স দ্বারা পাস হয়), ইনহেরিটেন্স, ডিইনিশিয়ালাইজেশন এবং রেফারেন্স কাউন্টিং সমর্থন করে। ডেভেলপাররা struct কে ডিফল্ট টাইপ হিসেবে সুপারিশ করেন।
Mutating একটি কিওয়ার্ড যা নির্দেশ করে যে কাঠামোর একটি মেথড তার প্রপার্টি পরিবর্তন করতে পারে। Mutating ছাড়া, কম্পাইলার ফিল্ড পরিবর্তন নিষিদ্ধ করে। Mutating মেথড শুধুমাত্র var দিয়ে ঘোষিত ভেরিয়েবলের উপর কল করা যেতে পারে, let-এর উপর নয়।
Copy-on-Write (COW) হল কাঠামোর জন্য Swift-এর একটি অপটিমাইজেশন যেখানে ডেটার প্রকৃত কপি প্রথম মিউটেশন পর্যন্ত স্থগিত রাখা হয়। যতক্ষণ সব ভেরিয়েবল শুধুমাত্র কাঠামো পড়ে, তারা একটি একক মেমরি এলাকা ভাগ করে। এটি বড় কালেকশনের সাথে কাজ করার সময় পারফরম্যান্স উন্নত করে।
ইনহেরিটেন্স ছাড়া ডেটা মডেল, কনফিগারেশন, DTO এবং মাল্টিথ্রেডেড পরিস্থিতির জন্য struct ব্যবহার করুন। UIKit/AppKit UI কম্পোনেন্ট, সিংগলটন, শেয়ারড আইডেন্টিটি আছে এমন সত্তা (delegate, observer) এবং ডিইনিশিয়ালাইজেশন প্রয়োজন এমন অবজেক্টের জন্য class ব্যবহার করুন।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন