Swift আজকের দিনের টপমোস্ট টাইপ-সেফ ল্যাঙ্গুয়েজগুলোর একট। ???
ওহ ওয়াইট!! টাইপ-সেফ ল্যাঙ্গুয়েজ বলতে কী বোঝায়? ?
একটি টাইপ-সেফ ল্যাঙ্গুয়েজ সবসময় নিশ্চিত করে যে একটি অপারেশন সেই পয়েন্টে উপলব্ধ সঠিক ধরনের ডেটার সাথে কাজ করছে।✓
যদি একটি ল্যাঙ্গুয়েজে বিভিন্ন ডেটা টাইপ ডিক্লেয়ার করার ক্ষমতা থাকে (যেমন, Int, Float, String, Array, Dictionary) এবং এটি নিশ্চিত করতে পারে যে একটি নির্দিষ্ট ডেটা টাইপের সাথে ডিক্লেয়ার করা একটি ভেরিয়েবল কখনো অন্য কোনো ধরনের ডেটা ধারণ করবে না, তবে তাকে টাইপ-সেফ ল্যাঙ্গুয়েজ বলা হয়।
টাইপ-সেফ ল্যাঙ্গুয়েজে, টাইপ চেকিং সবসময় হয়। এটি কম্পাইল টাইমে বা রান টাইমে হতে পারে ল্যাঙ্গুয়েজের ওপর নির্ভর করে।✅
এখন, Swift-এ Generics কী?
Generics টাইপ-সেফ, এবং আমাদের ফ্লেক্সিবল, রিযুজেবল ফাংশন এবং টাইপ লেখতে সাহায্য করে। Generics ব্যবহার করে, আমরা এমন কোড লিখতে পারি যা সকল ডেটা টাইপের জন্য কাজ করে। যেহেতু Swift একটি টাইপ-সেফ ল্যাঙ্গুয়েজ, এটি ভাঙ না করেই আমরা জেনেরিক কোড লিখতে পারি যা কোড ডুপ্লিকেশন এড়াতে সাহায্য করে।
একটি সহজ উদাহরণ নিই: একটি Array একটি অর্ডারড কলেকশন যা একই ধরনের ডেটা ধারণ করতে পারে। তাই Array-এর ডেফিনিশনে আমরা দেখতে পাই যে এটি Element. নামে একটি জেনেরিক টাইপ নেয়। তাই একটি Array একটি জেনেরিক টাইপ অফ কলেকশন হয়ে যায়।
ঠিক আছে। কুল। তারপর Swift-এ Any টাইপ কী????
Swift Any টাইপও সাপোর্ট করে। নামটাই ইঙ্গিত দিচ্ছে, এটি যেকোনো টাইপের ইনস্ট্যান্স রিপ্রেজেন্ট করতে পারে যেন স্ট্রাক্ট, ক্লাস, এনাম এবং ফাংশন টাইপ।
তাহলে Objective C id এবং Swift-এর Any একই কি??
Swift 3-এ, Objective C id টাইপ Swift-এর Any টাইপে ম্যাপ করে। এটি Swift এবং Objective C-এর কম্প্যাটিবিলিটি উন্নত করে।
কিন্তু কীভাবে এবং কেন??
Swift 2-এ, Objective C id Swift-এর AnyObject-এ ম্যাপ করা হত। এটি অধিকাংশ কেসে ভালো কাজ করত, কিন্তু কখনো কখনো আশা বিপরীত আচরণ ফলাফল দিত। Swift-এ একটি মূল ধারণা হলো Value Types, এবং এই ম্যাপিং এই ধারণার সাথে ন্যায় করত না।
Swift iOS ডেভেলপমেন্টের জন্য একটি নতুন ল্যাঙ্গুয়েজ, আর Objective C বছরের পর বছর আছে। তাই অবশ্যই অধিকাংশ প্রজেক্ট Objective C-এ তৈরি হত। এখন একটি Objective C প্রজেক্টকে Swift প্রজেক্টে কনভার্ট করার জন্য, রিকোয়ারমেন্ট এসেছিল যে যেকোনো Swift টাইপ যেকোনো Objective C অবজেক্টে ব্রিজ করা সম্ভব হোক।
কিন্তু এটি Swift ক্লাস এবং Swift ভ্যালু টাইপ যেমন Int, String, Float-এর জন্য সমস্যা ছিল না কারণ তাদের ইতিমধ্যে Objective C কাউন্টারপার্টস আছে। সমস্যা এসেছিল Swift ভ্যালু টাইপগুলোর জন্য যাদের কোনো Objective C কাউন্টারপার্ট নেই।
এটি ফিক্স করার জন্য, Objective C id টাইপ Swift Any টাইপে ম্যাপ করা হয়েছে।✅✅✅
বাস ডেফিনিশন। এখন মূল টপিকে আসি। উপরের পয়েন্টগুলো থেকে লাগে Generics এবং Any টাইপ একই। কিন্তু সত্যিকারের একই কি???
উচ্চ স্তরে, Any Generics-এর মতো লাগতে পারে। কিন্তু কিছু পার্থক্য খুঁজে বের করার চেষ্টা করি-???
আমরা সবাই জানি ডেটা স্ট্রাকচারে Stack কী। একটি স্ট্যাক একটি বেসিক লিনিয়ার ডেটা স্ট্রাকচার যেখানে আইটেম ইনসারশন এবং ডিলিশন একই এন্ডে হয়।
এখন আমরা Swift-এ Stack স্ট্রাকচার বাস্তবায়ন করব। প্রথমে Generics ব্যবহার করে, তারপর Any টাইপ ব্যবহার করে।
Generics ব্যবহার করে Stack বাস্তবায়ন:
উপরের Stack বাস্তবায়ন Generics ব্যবহার করে। স্ট্রাক্ট একটি Element আইটেমের জেনেরিক টাইপ নেয় এবং সেই আইটেম ব্যবহার করে একটি স্ট্যাক বাস্তবায়ন করে। এখন জেনেরিক Stack-এ কিছু অপারেশন করি:
এটি একটি জেনেরিক Stack ডিক্লেয়ার করে যা ইন্টিজার টাইপের এলিমেন্ট ধারণ করতে পারে। আমরা ইন্টিজার এলিমেন্ট স্ট্যাকে পুশ করছি। এই পয়েন্ট পর্যন্ত সব ঠিকমতো কাজ করছে।
কিন্তু যদি আমি সেই জেনেরিক Stack-এ উপরে একটি ফ্লোট এলিমেন্ট পুশ করতে চাই?

❌❌ উহ! কম্পাইলেশন এরর! ❌❌
Any টাইপ ব্যবহার করে Stack বাস্তবায়ন:
এই Stack বাস্তবায়নে, items অ্যারে যেকোনো টাইপের এলিমেন্ট ধারণ করতে পারে। আমরা ডেফিনিশনে items অ্যারে এলিমেন্টের এক্স্যাক্ট ডেটা টাইপ কী হবে সেটা স্পেসিফাই করছি না। এখন এই স্ট্যাকেও একই বেসিক অপারেশন করি:
কোনো সমস্যা নেই, ঠিক না? এখানেও সব ঠিকমতো চলছে। প্রাথমিকভাবে, আমরা একটি স্ট্যাক ডিক্লেয়ার করলাম এবং দুটি ইন্টিজার এলিমেন্ট পুশ করলাম। যখন আমরা show() মেথড কল করি, এটি একজাক্ট অ্যারে [3, 4] প্রিন্ট করে।
এখন একটি ফ্লোট ভ্যালু পুশ করি।☄️

✅✅ কোনো এরর নেই! সব ঠিকমতো চলছে! ✅✅
তাহলে পেছনের দৃশ্যে কী হচ্ছে? আমরা কেন কোনো এরর পাচ্ছি না????
Generics মূলত কম্পাইলারকে বলে যে:
আমি একটি জেনেরিক টাইপ ডিক্লেয়ার করলাম এবং পরে আপনাকে একজাক্ট টাইপ দেব। আমি চাই আপনি সেটা সেখানে অ্যাপ্লাই করুন যেখানে আমি স্পেসিফাই করেছি।
Any টাইপ মূলত কম্পাইলারকে বলে:
এই ভেরিয়েবলের ব্যাপারে চিন্তা করবেন না, এখানে কোনো টাইপ অ্যাপ্লাই করার দরকার নেই, আমি যা ইচ্ছা করব।
Generics ফ্লেক্সিবল ফাংশন ডিফাইন করতে ব্যবহার করা যেতে পারে, কিন্তু আর্গুমেন্টের টাইপগুলো এখনও কম্পাইলার চেক করে। Any টাইপ Swift-এর টাইপ সিস্টেম এড়াতে ব্যবহার করা যেতে পারে।?
জেনেরিক স্ট্যাক ডিক্লেয়ারেশনে, আমরা কম্পাইলারকে বলছি যে স্ট্যাক শুধু ইন্টিজার টাইপ নেবে। তারপর যখন আমরা সেটিতে ফ্লোট টাইপের এলিমেন্ট ইনসার্ট করার চেষ্টা করি, অর্থাৎ আমরা সেই প্রতিশ্রুতি ভাঙছি। তাই এটি কম্পাইল টাইম এরর থ্রো করে। এটি সবসময় আশা করে যে এলিমেন্টটি ইন্টিজার টাইপের হবে।
কিন্তু Any Stack-এর জন্য, আমরা কোনো কম্পাইল টাইম বা রানটাইম এরর পাই না। এমনকি যদি আমরা show() মেথড কল করি, এটি স্ট্যাককে [3, 4, 5.0] হিসাবে প্রিন্ট করে মানে স্ট্যাক ইন্টিজার এবং ফ্লোট দুটো টাইপের ভ্যালু ধরে রাখছে। তাই Any Stack-এ কোনো টাইপ রেস্ট্রিকশন নেই, আমরা যেকোনো টাইপের ভ্যালু পুশ করতে পারি (বাট রানটাইম এক্সেপশনের সম্ভাবনা আছে)।
উপসংহার
তাই যদি আমরা Generics ব্যবহার করি তবে আমরা ফ্লেক্সিবল ফাংশন, স্ট্রাকচার, ক্লাস, এবং প্রোটোকল লিখতে পারি Swift-এর টাইপ সেফটি কমপ্রোমাইজ না করে। কিন্তু যদি Any টাইপ ব্যবহার করি, তবে আমরা একরকম নিজেদের বস, আমরা আмайিক খায়ালা почти কিছুই করতে পারি।
??? চিয়ার্স!!! পড়ার জন্য ধন্যবাদ!! ???