আমি ফাংশনগুলির পরিবর্তে ভেরিয়েবল ব্যবহার করে এপিআই ডিজাইন করা সমস্যার কারণ হিসাবে অনেক কারণ দেখেছি এবং গণনা করা বৈশিষ্ট্যগুলি ব্যবহার করা আমার কাছে কার্যকারিতার মতো মনে হয়। আপনার দৃষ্টান্তের ভেরিয়েবলগুলি এনকেপসুলেটেড রাখার জন্য যথেষ্ট কারণ রয়েছে। এখানে আমি একটি প্রোটোকল অটোমোবাইল তৈরি করেছি যা গাড়ি অনুসারে চলে। এই প্রোটোকলের একটি অ্যাকসেসর পদ্ধতি রয়েছে যা একটি চ্যাসিস অবজেক্টকে ফেরত দেয়। যেহেতু গাড়ি এটিকে সম্মতি জানায় রেসকার সাবক্লাস এটিকে ওভাররাইড করতে পারে এবং একটি ভিন্ন চ্যাসিস সাবক্লাস ফিরে আসতে পারে। এটি কার শ্রেণিকে একটি ইন্টারফেসে প্রোগ্রাম করতে দেয় (অটোমোবাইল) এবং রেসিংচ্যাসিস সম্পর্কে জানে এমন রেসকার শ্রেণি সরাসরি _racingChassis পরিবর্তনশীল অ্যাক্সেস করতে পারে।
class Chassis {}
class RacingChassis: Chassis {}
protocol Automobile {
func chassis() -> Chassis
}
class Car: Automobile {
private var _chassis: Chassis
init () {
_chassis = Chassis()
}
func chassis() -> Chassis {
return _chassis
}
}
class RaceCar: Car {
private var _racingChassis: RacingChassis
override init () {
_racingChassis = RacingChassis()
super.init()
}
override func chassis() -> Chassis {
return _racingChassis
}
}
ভেরিয়েবলগুলি ব্যবহার করে কেন এপিআই ডিজাইন করা তার আরেকটি উদাহরণ হ'ল যখন আপনার কোনও প্রোটোকলে ভেরিয়েবল থাকে। আপনি যদি সমস্ত প্রোটোকল ফাংশনকে কোনও এক্সটেনশনে বিভক্ত করতে চান তবে সংরক্ষণকৃত সম্পত্তি ব্যতীত এক্সটেনশানগুলিতে স্থাপন করা যায় না এবং ক্লাসে সংজ্ঞায়িত করতে হয় (কোডটি সংকলনের জন্য এটি পেতে কোডটি অসাধারণ করতে হবে) অভিযোজিতভিউ কনট্রোলার ক্লাস এবং এক্সটেনশন থেকে মোড ভেরিয়েবল অপসারণ করুন:
protocol Adaptable {
var mode: Int { get set }
func adapt()
}
class AdaptableViewController: UIViewController {
// var mode = 0
}
extension AdaptableViewController: Adaptable {
var mode = 0 // compiler error
func adapt() {
//TODO: add adapt code
}
}
উপরের কোডটিতে এই সংকলক ত্রুটি থাকবে: "এক্সটেনশনে স্টোরের বৈশিষ্ট্য নাও থাকতে পারে"। এখানে আপনি উদাহরণটি কীভাবে পুনরায় লিখতে পারেন যাতে প্রোটোকলের সমস্ত কিছুই এর পরিবর্তে ফাংশন ব্যবহার করে এক্সটেনশনে আলাদা করা যায়:
protocol Adaptable {
func mode() -> Int
func adapt()
}
class AdaptableViewController: UIViewController {
}
extension AdaptableViewController: Adaptable {
func mode() -> Int {
return 0
}
func adapt() {
// adapt code
}
}
strongসম্পত্তি সহ একটি উদ্দেশ্যমূলক সি শ্রেণি এবং এটির উপর চাপ দেওয়ার চেষ্টা করেও আমি একটি ত্রুটি পেয়েছি - তবে মনে হচ্ছে আমি এটি মিস করেছি যে এটি একটি "স্পষ্টতভাবে মোড়কযুক্ত optionচ্ছিক" (chassis!) তে অনুবাদ করে সুইফ্ট, সুতরাংoverride var chassis : Chassis!এটি ঠিক করুন।