সুইফটে কখন @objc ব্যবহার করবেন?


89

সুইফটে, আমি কিছু পদ্ধতি দেখতে পাচ্ছি যেমন:

@objc private func doubleTapGestureRecognized(recognizer: UITapGestureRecognizer)

আমি ভাবছিলাম, @objc কখন ব্যবহার করবেন? আমি কিছু নথি পড়েছি, তবে তারা বলছে আপনি যখন এটি উদ্দেশ্য-সি-তে কল করতে চান, আপনার @objc পতাকা যুক্ত করা উচিত

যাইহোক, এটি সুইফটে একটি ব্যক্তিগত ফাংশন, @obj কী করবে?


4
সুন্দর প্রশ্ন !!!
এরহান ডেমিরসি

উত্তর:


68

ব্যক্তিগত মানে এটি কেবল সুইফটে দৃশ্যমান। সুতরাং অবজেক্টি-সি-তে দৃশ্যমান হতে @objc ব্যবহার করুন। যদি আপনার কাছে সুইফটে প্রাইভেট ফানক নির্বাচন করতে কোনও ফানক থাকে তবে এটি প্রয়োজনীয়।

@Objc বৈশিষ্ট্যটি আপনার সুইফট এপিআইকে উদ্দেশ্য-সি এবং অবজেক্টিভ-সি রানটাইমে উপলব্ধ করে available

দেখুন: https://developer.apple.com/library/ios/docamentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html

https://developer.apple.com/library/ios/docamentation/Swift/Concepual/BuildingCocoaapps/IntteractingWithObjective-CAPIs.html


4
সুতরাং @objc private func doubleTapGestureRecognized, @objc এবং প্রাইভেট উভয়ই রাখার কী দরকার? আপনি কি বলছেন অবজেক্টিভ-সি ক্লাসগুলি ডাবলট্যাপগাস্টাররিকনাইজড ওভাররাইট করতে পারে?
উইংজারো

4
আমার ধারণা, কারণ আপত্তি-সি আপনি যে কোনও পদ্ধতিতে ওভাররাইট করতে পারেন।
অদ্ভুত সময় 16

4
এই উত্তরটি কীভাবে সঠিক তা নিশ্চিত নয় এবং তাঁর প্রশ্নটির উত্তর দেয় Not তবে এখানে প্রদত্ত উত্তরগুলি ইতিমধ্যে তাঁর প্রশ্নে রয়েছে "তবে তারা যখন বলছেন আপনি যখন এটি উদ্দেশ্য-সিতে কল করতে চান, তখন আপনাকে তার প্রধান \ @objc পতাকা" যুক্ত করা উচিত প্রশ্নটি হল "এটি দ্রুতগতির মধ্যে একটি ব্যক্তিগত কাজ, ob @obj কী করে?"
কেবিজে

4
লিঙ্কগুলি বিরতি। বিশেষত অ্যাপল ডকুমেন্টেশন। এখানে ডকুমেন্টেশন থেকে মূল উপাদানগুলি নিষ্কাশন বিবেচনা করুন।
লেভিগ্রোগার

57

আরেকটি দেরী উত্তর, কিন্তু এই প্রশ্নের বিদ্যমান উত্তরগুলির মধ্যে কোনওটিই আসলে ওপি-র প্রশ্নের উত্তর দেয় না, যা হ'ল: কেন হেক্ট আপনাকে @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 সিস্টেম এবং এটিকে খুঁজে পেতে এবং সেটিতে কল, কিন্তু এটা আমাদের কোডের ক্লায়েন্ট প্রাসঙ্গিক নয়।

এছাড়াও, একটি ম্যাকোস অ্যাপ্লিকেশনটিতে এমন একটি ভিউ কন্ট্রোলার যা প্রয়োগের বিশদ হিসাবে কোকো বাইন্ডিংস ব্যবহার করে তার ভিউতে নিয়ন্ত্রণগুলি আপডেট করে সেগুলি নিয়ন্ত্রণগুলিকে আবদ্ধ করার জন্য কিছু বেসরকারী বৈশিষ্ট্য কেভিসি-অনুসারী করতে পারে।

সুতরাং আপনি যেমন দেখেন, এমন সময় রয়েছে যখন কোনও কোড বা সম্পত্তিটিকে ফ্রেমওয়ার্কগুলির সাথে ইন্টারঅ্যাক্ট করার জন্য অবজেক্টিভ সি-তে প্রকাশ করার প্রয়োজন হতে পারে, অগত্যা আপনার কোডের ক্লায়েন্টদের কাছে দৃশ্যমান হওয়ার প্রয়োজন ছাড়াই।


ধন্যবাদ এটি একটি ভাল উত্তর যা প্রশ্নকে সরাসরি সম্বোধন করেছিল।
hqt

25

@objc / গতিশীল

এটি সামঞ্জস্যের জন্য: আপনি একবার নিজের সুইফট ফাইল / কোডটি উদ্দেশ্য-সি ভিত্তিক প্রকল্পে আমদানি করুন।

এবং আপনি যদি নিজের সম্পত্তি / পদ্ধতিটি উদ্দেশ্য-সি কোড বা শ্রেণি দ্বারা অ্যাক্সেস করতে চান তবে এটি ব্যবহার করুন।

আপনি যখন উদ্দেশ্য-সি বেস শ্রেণীর একটি সুইফ্ট শ্রেণিকে সাব ক্লাসিং করছেন তখন বেশিরভাগ সময় এটি ঘটে।

অ্যাক্সেসযোগ্য এবং উদ্দেশ্য-সিতে ব্যবহারযোগ্য হওয়ার জন্য একটি সুইফ্ট ক্লাস বা প্রোটোকল অবশ্যই @objc বৈশিষ্ট্যের সাথে চিহ্নিত করতে হবে। এই বৈশিষ্ট্যটি সংকলককে বলে যে এই সুইফট কোডের টুকরাটি উদ্দেশ্য-সি থেকে অ্যাক্সেস করা যেতে পারে। যদি আপনার সুইফ্ট ক্লাসটি কোনও উদ্দেশ্য-সি শ্রেণীর বংশধর হয় তবে সংকলকটি স্বয়ংক্রিয়ভাবে আপনার জন্য @objc বৈশিষ্ট্য যুক্ত করে।

এখানে আপেল ডকুমেন্টেশন যা সম্পর্কে বলা হয়েছে @objc

উদ্দেশ্য-সি থেকে সুইফ্ট ব্যবহার করা

ভাষা ইন্টারঅ্যাপেরিবিলিটি সামঞ্জস্যতা

লিঙ্কগুলি আপডেট হয়েছে:
দেখে মনে হচ্ছে লিঙ্কগুলি আপেল দ্বারা আপডেট হয়েছে।


11

@objc একটি শ্রেণি বৈশিষ্ট্য, তাই আপনি ব্যবহার করুন

@objc public class MyClass

এটি ক্লাসের পদ্ধতিগুলি উদ্দেশ্য সি ক্লাসে প্রকাশ করে, সুতরাং আপনার ক্লাসে যদি জনসাধারণের কাজ থাকে তবে আপনি কেবল এটি ব্যবহার করবেন


8

দেরিতে উত্তর, তবে এই @objcআচরণটি সুইফট 4 (যা এক্সকোড 9 এ প্রকাশিত হয়েছিল, যা সাধারণত 10 দিন আগে প্রকাশিত হয়েছিল) হিসাবে সামান্য পরিবর্তিত হচ্ছে।

সুইফ্ট 4-এ, কিছু অনুমানের মামলা @objcসরানো হয়। এর অর্থ কিছু অতিরিক্ত ক্ষেত্রে যেখানে @objcসুইডার সংকলক দ্বারা শিরোনামটি অনুমান করা হয়েছিল আগে এটি সুইফট 4 এ অনুমান করা হয়নি।

এই পরিবর্তন সম্পর্কে সুইফট বিবর্তনের প্রস্তাবটিতে আরও পড়ুন

যেমনটি উল্লেখ করা হয়েছে, সাধারণভাবে @objcহ'ল অবজেক্টিভ-সি রানটাইমের কাছে কিছু পদ্ধতি উদ্ভাসিত করা, যা ভাষাটির সুইফটের আন্তঃব্যবহারের অংশ।


4
সুতরাং এই কারণটি হওয়া উচিত কেন সুইফট 4 এ আপডেট করার পরে কিছু ভেরিয়েবলগুলি সঠিকভাবে ওজেজেসি থেকে অ্যাক্সেসযোগ্য নয়? সুইফট ৩ এক্স এর সাথে যুক্ত করার দরকার নেই@objc
rgkobashi

ওহ ঠিক আছে, অন্য কারও সাথে ডাবল চেক করা সর্বদা ভাল, ধন্যবাদ!
rgkobashi

1

@objcএকটি বিবরণ প্রকাশ করে Objective-C runtime#selectorএকটি উদ্দেশ্য-সি রানটাইম ব্যবহারের জন্য সুইফটের বৈশিষ্ট্যটি একবার দেখে নেওয়া যাক । এক্ষেত্রে আপনি আপনার সুইফটকে আরও সংজ্ঞায়িত করতে সক্ষম হন @objc private func[আরও]

উদ্দেশ্য-সি থেকে সুইফটের ফাংশনগুলি ব্যবহার করতে:

  1. সুইফ্টের ক্লাসটি বাড়ানো উচিত NSObject
  2. চিহ্নিত সুইফট:

    ক। @objcMembers শ্রেণী শুধুমাত্র - তা প্রকাশ করার সব public কনস্ট্রাকটর , ক্ষেত্র এবং পদ্ধতি । এছাড়াও এটি সাবক্লাসের জন্য প্রযোজ্য

    খ। @objc শ্রেণি / এনাম / প্রোটোকল ( কাঠামো ব্যতীত ) [নামযুক্ত প্রকার]

    • @objc বর্গ (alচ্ছিক) - একটি ডিফল্ট প্রকাশ করতে public init()। বা @objc(<custom_name>)শ্রেণীর জন্য একটি কাস্টম নাম সেটআপ করতে।
    • @objc নির্মাতারা , ক্ষেত্র এবং পদ্ধতি - তাদের নির্বাচিতভাবে প্রকাশ করতে

পরবর্তী নামকরণের মাধ্যমে সুইফ্টের পদ্ধতিটি উপলব্ধ হবে:

<swiftName>With<firstArgument>:<secondArgument>:

উদাহরণ স্বরূপ:

public func printHelloWorld(arg1: String, arg2:String)
//is reached through: 
[someObject printHelloWorldWithArg1: arg2:];

[ @objcএবং dynamic]

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.