Extension Swift-এ একটি প্রক্রিয়া যা বিদ্যমান টাইপের সোর্স কোড পরিবর্তন না করেই নতুন কার্যকারিতা যোগ করার অনুমতি দেয়। এক্সটেনশনগুলি মেথড, গণনাকৃত বৈশিষ্ট্য, ইনিশিয়ালাইজার, সাবস্ক্রিপ্ট, নেস্টেড টাইপ এবং প্রোটোকল কনফরমেন্স সমর্থন করে। Apple ডকুমেন্টেশন, 2026 অনুসারে, এক্সটেনশনগুলি Swift প্রজেক্টে কোড সংগঠন এবং ওপেন/ক্লোজ্ড নীতি মেনে চলার জন্য একটি মূল হাতিয়ার।
মূল বিষয়
Extension Swift-এ একটি ভাষা নির্মাণ যা বিদ্যমান টাইপ (ক্লাস, স্ট্রাকচার, এনাম, প্রোটোকল) নতুন ক্ষমতা দিয়ে সম্প্রসারণ করার অনুমতি দেয়। এটি Objective-C-এর ক্যাটাগরির মতো কিন্তু আরও শক্তিশালী।
Extension যোগ করতে পারে:
Apple ডকুমেন্টেশন অনুসারে, extension বিদ্যমান মেথড ওভাররাইড করতে পারে না (ডায়নামিক ডিসপ্যাচ) এবং সংরক্ষিত বৈশিষ্ট্য যোগ করতে পারে না। এই সীমাবদ্ধতাগুলি মূল টাইপের অখণ্ডতা রক্ষা করে।
Extension কীওয়ার্ড extension দিয়ে ঘোষণা করা হয় যার পরে সম্প্রসারিত টাইপের নাম আসে।
extension Double {
var km: Double { return self * 1000.0 }
var cm: Double { return self / 100.0 }
var mm: Double { return self / 1000.0 }
}
let distance = 5.0.km
print("5 km = \(distance) meters") // 5000.0
শুধু নিজস্ব টাইপ নয়, Swift, Foundation, UIKit এবং অন্যান্য ফ্রেমওয়ার্কের স্ট্যান্ডার্ড লাইব্রেরি টাইপও সম্প্রসারণ করা যায়। এটি extension-কে ডোমেইন-নির্দিষ্ট কার্যকারিতা যোগ করার জন্য একটি শক্তিশালী হাতিয়ার করে তোলে।
Extension যেকোনো বিদ্যমান টাইপে ইনস্ট্যান্স এবং টাইপ মেথড যোগ করার অনুমতি দেয়।
extension String {
func isValidEmail() -> Bool {
let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}"
return self.range(of: emailRegex, options: .regularExpression) != nil
}
static func random(length: Int) -> String {
let letters = "abcdefghijklmnopqrstuvwxyz0123456789"
return String((0..<length).map { _ in letters.randomElement()! })
}
}
let email = "user@example.com"
print(email.isValidEmail()) // true
let code = String.random(length: 8) // "a3f8k2m1"
মিউটেটিং মেথড ভ্যালু টাইপ (struct, enum) সম্প্রসারণ করে এবং self পরিবর্তন করতে পারে। ক্লাসের জন্য মিউটেটিং প্রয়োজন হয় না। Extension স্ট্যান্ডার্ড লাইব্রেরি টাইপেও মিউটেটিং মেথড যোগ করতে পারে।
Extension শুধু গণনাকৃত বৈশিষ্ট্য যোগ করতে পারে — সংরক্ষিত বৈশিষ্ট্য অনুমোদিত নয়। এটি যুক্তিসঙ্গত কারণ extension মূল টাইপের মেমোরি ব্যবস্থাপনা করে না।
extension Date {
var isPast: Bool {
return self < Date()
}
var isToday: Bool {
return Calendar.current.isDateInToday(self)
}
}
let someDate = Date().addingTimeInterval(3600)
print(someDate.isPast) // false (one hour from now is future)
Extension-এ গণনাকৃত বৈশিষ্ট্য মূল বাস্তবায়নের মতো একই নিয়ম অনুসরণ করে: আপনি { get } এবং { get set } বৈশিষ্ট্য তৈরি করতে পারেন। Swift একটি টাইপের জন্য এক্সটেনশনের সংখ্যার উপর কোনো সীমা আরোপ করে না। আপনি আলাদা ফাইলে একটি টাইপের জন্য যত খুশি এক্সটেনশন ঘোষণা করতে পারেন — বড় প্রজেক্টে এটি মানক অভ্যাস।
Extension প্রোটোকল বাস্তবায়নের পছন্দের উপায়। মূল টাইপ ঘোষণা জটিল করার পরিবর্তে, সমস্ত প্রোটোকল মেথড একটি আলাদা extension-এ রাখা হয়।
struct User {
let id: Int
let name: String
let email: String
}
// Extension per protocol — clean separation
extension User: Equatable {
static func == (lhs: User, rhs: User) -> Bool {
return lhs.id == rhs.id
}
}
extension User: Codable {
enum CodingKeys: String, CodingKey {
case id, name, email
}
}
এই পদ্ধতি দায়িত্ব পৃথক করে: মূল কাঠামোতে শুধু সংরক্ষিত বৈশিষ্ট্য থাকে, এক্সটেনশনে প্রোটোকল বাস্তবায়ন থাকে। Swift এমন টাইপের জন্যও extension-এর মাধ্যমে প্রোটোকল বাস্তবায়নের অনুমতি দেয় যা আমরা নিয়ন্ত্রণ করি না।
Extension শুধু একটি ভাষা বৈশিষ্ট্য নয় বরং আর্কিটেকচারাল সংগঠনের একটি হাতিয়ার। এক্সটেনশনের সঠিক ব্যবহার কোডকে পঠনযোগ্য এবং রক্ষণাবেক্ষণযোগ্য করে তোলে।
// MARK: - Equatable নেভিগেশনের জন্যprivate হিসেবে চিহ্নিত// MARK: - User + Displayable
extension User: Displayable {
var displayName: String {
return "\(name) (\(email))"
}
}
Swift API ডিজাইন নির্দেশিকা অনুসারে, এক্সটেনশনগুলি পঠনযোগ্যতা উন্নত করে: ডেভেলপার মূল ঘোষণায় ডেটা কাঠামো এবং এক্সটেনশনে লজিক দেখে। এটি ইন্টারফেস পৃথকীকরণ নীতির সাথে সামঞ্জস্যপূর্ণ।
where সীমাবদ্ধতা সহ extension শুধু নির্দিষ্ট টাইপের জন্য মেথড যোগ করে: extension Array where Element: Equatable { func isUnique() -> Bool }. এই ধরনের কোড সংক্ষিপ্ত এবং টাইপ-নিরাপদ — isUnique মেথড শুধু Equatable উপাদানযুক্ত অ্যারেতে দেখা যায়, কম্পাইল সময়ে ত্রুটি দূর করে এবং API অন্যান্য ডেভেলপারের জন্য পরিষ্কার, নিরাপদ এবং স্পষ্ট করে তোলে।
সচরাচর জিজ্ঞাসিত প্রশ্ন
না, extension সংরক্ষিত বৈশিষ্ট্য যোগ করতে পারে না। এই সীমাবদ্ধতা মৌলিক: extension টাইপ ইনস্ট্যান্সের জন্য মেমোরি বরাদ্দে অংশগ্রহণ করে না। সংরক্ষিত বৈশিষ্ট্যের জন্য, মূল টাইপ ঘোষণা ব্যবহার করুন।
না, extension মেথড ওভাররাইড করতে পারে না। বিদ্যমান মেথডের মতো একই সিগনেচরে মেথড ঘোষণার চেষ্টা কম্পাইলেশন ত্রুটির কারণ হবে। ওভাররাইডিংয়ের জন্য, ক্লাস ইনহেরিটেন্স ব্যবহার করুন।
Extension নতুন টাইপ তৈরি না করেই কার্যকারিতা যোগ করে। Subclassing একটি শ্রেণিবিন্যাস তৈরি করে এবং ওভাররাইডিং সমর্থন করে। Extension-এর মূল সোর্স কোডে অ্যাক্সেসের প্রয়োজন হয় না এবং এটি সব টাইপের সাথে কাজ করে।
হ্যাঁ, extension জেনেরিক হতে পারে যদি সম্প্রসারিত টাইপ জেনেরিক হয়: extension Array where Element: Numeric. আপনি extension-এর ভিতরে নিজস্ব টাইপ প্যারামিটার সহ জেনেরিক মেথড যোগ করতে পারেন।
Extension কর্মক্ষমতা প্রভাবিত করে না — extension মেথডগুলি সাধারণ মেথডের মতো কম্পাইল হয়। extension সহ প্রোটোকলের জন্য স্ট্যাটিক ডিসপ্যাচ ব্যবহার করা হয়, যা ক্লাসের ডায়নামিক ডিসপ্যাচের চেয়ে দ্রুত হতে পারে।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন