আরেকটি দেরী উত্তর, কিন্তু এই প্রশ্নের বিদ্যমান উত্তরগুলির মধ্যে কোনওটিই আসলে ওপি-র প্রশ্নের উত্তর দেয় না, যা হ'ল: কেন হেক্ট আপনাকে @objc
কোনও private
শ্রেণীর সদস্যের জন্য ব্যবহার করতে হবে , যদি @objc
সেখানে উদ্দেশ্য-সি এর সাথে আলাপচারিতার জন্য রয়েছে, এবং যে সদস্য প্রশ্নে আছেন ব্যক্তিগত, এর অর্থ আপনার প্রকল্পে উদ্দেশ্যমূলক সি কোড থাকা সত্ত্বেও, সদস্যটিকে যেভাবেই দেখতে পারা উচিত নয়?
কারণটি হ'ল, কারণ অনেকগুলি ফ্রেমওয়ার্কগুলি উদ্দেশ্য-সিতে লেখা হয়, কখনও কখনও নির্দিষ্ট এপিআইয়ের সাথে ইন্টারঅ্যাক্ট করার জন্য উদ্দেশ্য-সি বৈশিষ্ট্যগুলির প্রয়োজন হয়।
উদাহরণস্বরূপ, ধরুন আমি এর মাধ্যমে একটি বিজ্ঞপ্তির জন্য নিবন্ধন করতে চাই DistributedNotificationCenter
:
DistributedNotificationCenter.default.addObserver(self,
selector: #selector(somethingHappened(_:)),
name: someNotification,
object: nil)
এটি কাজ করার জন্য, আমাদের somethingHappened
পদ্ধতির জন্য নির্বাচক পেতে সক্ষম হতে হবে । তবে নির্বাচকরা একটি উদ্দেশ্য-সি ধারণা, সুতরাং পদ্ধতিটি যদি উদ্দেশ্য-সিটির জন্য দৃশ্যমান না হয় তবে এটির কোনও নির্বাচক নেই। সুতরাং, পদ্ধতিটি ব্যক্তিগত এবং এমনকি নির্বিচারে বাইরের কোড দ্বারা কল না করা @objc
সত্ত্বেও DistributedNotification
, এটির নির্বাচকের মাধ্যমে এটি কল করতে সক্ষম হওয়ার জন্য, উদ্দেশ্যটি-সিতে লিখিত কোডটির জন্য একটি ক্রমের প্রয়োজন হবে ।
আর একটি সাধারণ ক্ষেত্রে যেখানে @objc
প্রয়োজন সেখানে হ'ল কী-ভ্যালু কোডিং (কেভিসি) সমর্থন করা, বিশেষত ম্যাকোএসে, যেখানে কেভিসি এবং কেভিও কোকো বাইন্ডিংগুলি প্রয়োগ করতে ব্যবহৃত হয়। কেভিসি হ'ল কোকো-র অন্যান্য সিস্টেমের মতোই, ওজেক্টিভ-সিতে প্রয়োগ করা হয়েছে, যা কেভিসির সাথে সঙ্গতিপূর্ণ বৈশিষ্ট্যগুলি ওজেক্টিভ-সি রানটাইমের সংস্পর্শে আনার প্রয়োজন রয়েছে। কখনও কখনও, কেভিসি-সম্মতিযুক্ত বৈশিষ্ট্যগুলি ব্যক্তিগত হওয়ার জন্য এটি অর্থবোধ করে। একটি উদাহরণ হ'ল যখন আপনার কোনও সম্পত্তি থাকে যা অন্যান্য বৈশিষ্ট্যগুলিকে প্রভাবিত করে:
@objc private dynamic var originalProperty: String
@objc private static let keyPathsForValuesAffectingDependentProperty: Set<String> = [
#keyPath(originalProperty)
]
@objc public var dependentProperty: String { return changeItSomehow(self.originalProperty) }
এই ক্ষেত্রে, আমাদের প্রকৃত সঞ্চিত সম্পত্তি ব্যক্তিগত, কিন্তু নির্ভরযোগ্য সম্পত্তি, যা আমরা বাইরের কোডে প্রকাশ করি , ব্যক্তিগত সম্পত্তি আপডেট হওয়ার পরে তার বিজ্ঞপ্তিগুলি প্রেরণ করা দরকার। ব্যক্তিগত সম্পত্তি হিসাবে চিহ্নিত করে @objc
, আমরা সহজেই কেভিসির নির্ভরতা স্থাপনের মাধ্যমে তা করতে পারি — অন্যথায়, আমাদের ব্যক্তিগত সম্পত্তি willSet
এবং didSet
হ্যান্ডলারের মধ্যে ম্যানুয়ালি বিজ্ঞপ্তিগুলি প্রেরণের জন্য কোড লিখতে হবে । উপরন্তু, স্ট্যাটিক সম্পত্তি যা তথ্য KVC সিস্টেম dependentProperty
নির্ভরশীল উপর originalProperty
চাহিদা উদ্দেশ্য সি উন্মুক্ত করা যাতে KVC সিস্টেম এবং এটিকে খুঁজে পেতে এবং সেটিতে কল, কিন্তু এটা আমাদের কোডের ক্লায়েন্ট প্রাসঙ্গিক নয়।
এছাড়াও, একটি ম্যাকোস অ্যাপ্লিকেশনটিতে এমন একটি ভিউ কন্ট্রোলার যা প্রয়োগের বিশদ হিসাবে কোকো বাইন্ডিংস ব্যবহার করে তার ভিউতে নিয়ন্ত্রণগুলি আপডেট করে সেগুলি নিয়ন্ত্রণগুলিকে আবদ্ধ করার জন্য কিছু বেসরকারী বৈশিষ্ট্য কেভিসি-অনুসারী করতে পারে।
সুতরাং আপনি যেমন দেখেন, এমন সময় রয়েছে যখন কোনও কোড বা সম্পত্তিটিকে ফ্রেমওয়ার্কগুলির সাথে ইন্টারঅ্যাক্ট করার জন্য অবজেক্টিভ সি-তে প্রকাশ করার প্রয়োজন হতে পারে, অগত্যা আপনার কোডের ক্লায়েন্টদের কাছে দৃশ্যমান হওয়ার প্রয়োজন ছাড়াই।