দুর্বল সংযোগ - কোনও শ্রেণি বিদ্যমান কিনা তা পরীক্ষা করে সেই শ্রেণিটি ব্যবহার করুন


87

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

আমি জানি যে আমি কিছুটা দুর্বল লিঙ্কিং ব্যবহার করতে চাই, তবে যে কোনও ডকুমেন্টেশন আমি ফাংশন অস্তিত্বের জন্য রানটাইম চেক সম্পর্কে আলোচনা জানতে পারি - আমি কীভাবে কোনও ক্লাসের উপস্থিতি পরীক্ষা করব?


ক্লাস কি? সম্ভবত অন্য workaround আছে।
মার্সেলো ক্যান্টোস

উত্তর:


164

টিএলডিআর

বর্তমান:

  • দ্রুত :if #available(iOS 9, *)
  • ওবজে-সি, আইওএস :if (@available(iOS 11.0, *))
  • ওবজ-সি, ওএস এক্স :if (NSClassFromString(@"UIAlertController"))

উত্তরাধিকার:

  • সুইফ্ট (2.0 এর পূর্বে সংস্করণ) :if objc_getClass("UIAlertController")
  • ওবজে-সি, আইওএস (৪.২ এর পূর্ববর্তী সংস্করণ) :if (NSClassFromString(@"UIAlertController"))
  • ওবজ-সি, আইওএস (১১.০ এর পূর্ববর্তী সংস্করণ) :if ([UIAlertController class])

সুইফট 2+

যদিও historতিহাসিকভাবে এটি নির্দিষ্ট ওএস সংস্করণগুলির চেয়ে দক্ষতা (বা শ্রেণীর অস্তিত্ব) পরীক্ষা করার জন্য সুপারিশ করা হয়েছে, তবে উপলভ্যতা পরীক্ষা করার প্রবর্তনের কারণে এটি সুইফট ২.০ তে ভাল কাজ করে না ।

পরিবর্তে এইভাবে ব্যবহার করুন:

if #available(iOS 9, *) {
    // You can use UIStackView here with no errors
    let stackView = UIStackView(...)
} else {
    // Attempting to use UIStackView here will cause a compiler error
    let tableView = UITableView(...)
}

দ্রষ্টব্য: আপনি পরিবর্তে ব্যবহার করার চেষ্টা করলে objc_getClass()আপনি নিম্নলিখিত ত্রুটি পাবেন:

U 'ইউআইএলআরলেটস কনট্রোলার' কেবল আইওএস 8.0 বা আরও নতুনতে উপলব্ধ on


পূর্ববর্তী সংস্করণ সুইফট

if objc_getClass("UIAlertController") != nil {
    let alert = UIAlertController(...)
} else {
    let alert = UIAlertView(...)
}

লক্ষ্য করুন objc_getClass() চেয়েও বেশি নির্ভরযোগ্য NSClassFromString()বাobjc_lookUpClass()


উদ্দেশ্য-সি, আইওএস 4.2+

if ([SomeClass class]) {
    // class exists
    SomeClass *instance = [[SomeClass alloc] init];
} else {
    // class doesn't exist
}

দেখুন আরো বিস্তারিত জানার জন্য code007 এর উত্তর


ওএস এক্স বা আইওএসের পূর্ববর্তী সংস্করণ

Class klass = NSClassFromString(@"SomeClass");
if (klass) {
    // class exists
    id instance = [[klass alloc] init];
} else {
    // class doesn't exist
}

ব্যবহার NSClassFromString()। যদি এটি ফিরে আসে nilতবে শ্রেণিটির অস্তিত্ব নেই, অন্যথায় এটি শ্রেণীর অবজেক্টটি ব্যবহার করবে যা প্রত্যাবর্তন করবে।

এই নথিতে অ্যাপল অনুসারে এটি প্রস্তাবিত উপায় :

[...] আপনার কোডটি [a] শ্রেণীর অস্তিত্বের জন্য পরীক্ষা NSClassFromString()করবে যা ব্যবহার করে [বৈধ শ্রেণি অবজেক্ট ফিরিয়ে দেবে যদি [শ্রেণি] উপস্থিত না থাকে বা শূন্য হয় না। যদি শ্রেণিটি বিদ্যমান থাকে তবে আপনার কোডটি এটি ব্যবহার করতে পারে [...]


ধন্যবাদ অন্যের জন্য উত্তর সম্পূর্ণ করার জন্য, একবার আপনি ক্লাসটি সনাক্ত করে একবার এটি তৈরির Classউদাহরণটি ব্যবহার করে তৈরি করেছেন NSClassFromString(এটি বরাদ্দ করুন id) এবং সে ক্ষেত্রে নির্বাচকদের অনুরোধ করুন।
সাইকোটিক

4
উল্লেখযোগ্যভাবে, এটি ওএসএক্সের একমাত্র উপায়, তবে iOS (4.2+) এ "সেরা" উপায় নয়, যদিও এটি কার্যকর হবে। আইওএসের জন্য কোড007 এর উত্তরটি বিশেষভাবে দেখুন।
বেন মোশার

আমার ক্লাসটি যদি সত্যিকারের ক্লাস না হয়ে বরং সি স্ট্রাক্ট হয়?
নাথান এইচ

নতুন চেক সহ সুইফট 4.1 আসছে canImportপ্রস্তাব
ডিসপ্যাচমেন

69

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

if ([UIPrintInteractionController class]) {
    // Create an instance of the class and use it.
} else {
    // Alternate code path to follow when the
    // class is not available.
}

উত্স: https://developer.apple.com/library/content/docamentation/DeveloperTools/ কনসেপ্টুয়াল / ক্রস_ডিভলেপমেন্ট / ইউজিং / ইউজিং html#// apple_ref/ doc/ uid/ 20002000-SW3

এই প্রক্রিয়াটি এনএস_সিএলএএসএলএস_আভিএআইএবিএল ম্যাক্রো ব্যবহার করে, যা আইওএসের বেশিরভাগ কাঠামোর জন্য উপলব্ধ (নোট করুন এমন কিছু ফ্রেমওয়ার্ক থাকতে পারে যা এখনও এনএস_সিএলএএসএলএস_আভিএআইএবিএল সমর্থন করে না - এটির জন্য আইওএস রিলিজ নোটটি পরীক্ষা করে দেখুন)। অতিরিক্ত সেটিং কনফিগারেশনও প্রয়োজন হতে পারে যা উপরের সরবরাহিত অ্যাপলের ডকুমেন্টেশন লিঙ্কে পড়তে পারে, তবে, এই পদ্ধতির সুবিধাটি হ'ল আপনি স্থির প্রকারের চেকিং পান।


4
গেমটি থেকে কিছুটা দেরি হলেও UIAlertControllerআইওএসকে সমর্থন করার সময় থাকা কোডটি তৈরির চেষ্টা করার সময় আমি কেবল এই সমস্যাটিতে ছড়িয়ে পড়েছি code. কোড 007 এর উত্তর সঠিক, তবে অতিরিক্ত কনফিগারেশনটি আপনার প্রকল্পের ইউআইকিটকে দুর্বলভাবে লিঙ্ক করা (থেকে সেট Requiredকরা Optional) করা উচিত (এই পরিস্থিতির জন্য, কমপক্ষে)
ইভান আর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.