সুইফট 4 মোডে সুইফ্ট 3 @ ওবজেসি অনুমিতির ব্যবহার অবচয়?


485

সংক্ষেপে, এক্সকোড 9 বিটা ব্যবহার করার সময়, আমি নিম্নলিখিত সতর্কতাটিতে চলে এসেছি:

সুইফট 4 মোডে সুইফ্ট 3 @ ওবজেসি ইনফারেন্সির ব্যবহার হ্রাস করা হয়েছে। অনুগ্রহ করে @objc অনুমানের সতর্কতাগুলিকে সম্বোধন করুন, "অবহেলিত সুইফ্ট 3 @ ওবিজেসি ইনফারেন্সের ব্যবহার" লগিং সক্ষম করে আপনার কোডটি পরীক্ষা করুন এবং সুইফট 3 @ ওবজেসি ইনফারেন্সটি অক্ষম করুন * **

কিছু গবেষণা করার পরেও, এখনও সমস্যাটি কীভাবে ঠিক করা যায় তা সম্পর্কে আমার কোনও ধারণা নেই। আমি কীভাবে এই সমস্যাটি সমাধান করবেন সেই সাথে যে কী চলছে তার ব্যাখ্যা সম্পর্কে যে কোনও পরামর্শের আমি প্রচুর প্রশংসা করব।

আমার কোডটি আমার কোড সহ কী ঘটছে সে সম্পর্কে আরও ভাল করে উপলব্ধি করা।


4
কোন বস্তু এটির কারণ হয়ে উঠছে তা আমি সত্যই সতর্কবার্তা থেকে পাই না। এক্সকোড সহজভাবে তা বলতে পারে না যে লাইনটি সেই বস্তুটি। কোনও পরামর্শ কীভাবে এই সতর্কতাটি আসছিল তা সন্ধান করবেন?
অলিভ

উত্তর:


816

আমি "লক্ষ্যবস্তু" এর লক্ষ্যমাত্রার "সুইফট 3 @objc ইনফারেন্স" বিল্ড সেটিংস পরিবর্তন করে এই সতর্কতা থেকে মুক্তি পেয়েছি।

এক্সকোড 9-এ সুইফট 3 @ ওবজেসি অনুমিতি অক্ষম করুন

এই নিবন্ধ থেকে :

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

সুইফ্ট 4-এ, এই জাতীয় স্বয়ংক্রিয় @objc অনুমিতি অবমূল্যায়ন করা হয়েছে কারণ এই সমস্ত উদ্দেশ্য-সি প্রবেশ পয়েন্টগুলি ব্যয় করা ব্যয়বহুল। যখন "সুইফট 3 @objc ইনফারেন্স" সেটিংসটি "চালু" এ সেট করা হয়, এটি পুরানো কোডটিকে কাজ করার অনুমতি দেয়। যাইহোক, এটি অবমূল্যায়ন সতর্কতাগুলি দেখাবে যা মোকাবিলা করা দরকার। এই সতর্কতাগুলিকে "ফিক্স" করার এবং সেটিংসটিকে "ডিফল্ট" এ স্যুইচ করার পরামর্শ দেওয়া হয় , যা নতুন সুইফ্ট প্রকল্পের জন্য ডিফল্ট।

আরও তথ্যের জন্য দয়া করে এই সুইফট প্রস্তাবটি দেখুন।


5
ধন্যবাদ এভেজেনি এটি কি দীর্ঘমেয়াদী সমাধান?
ডালেক

6
@ ডালেক হ্যাঁ, আমিও বিশ্বাস করি। আমি আমার উত্তরে উল্লেখ করা সুইফট প্রস্তাবনা অনুসারে, আপত্তিটির অনুধাবন হ্রাস করা হয়। "সুইফ্ট 3 অবজেক্ট ইনফারেন্স" সেটিংসটি কেবলমাত্র সেই প্রকল্পগুলিতে উপস্থিত রয়েছে যেগুলি সুইফটের পুরানো সংস্করণ থেকে স্থানান্তরিত হয়েছিল। যদি কেউ একটি নতুন প্রকল্প তৈরি করে, সেটিংসটি আর উপস্থিত নেই, যার অর্থ অবজেক্ট ইনফারেন্স বন্ধ। কোনও অবজেক্ট ইনফেরেন্স সতর্কতাগুলি সম্বোধন করে এটি "অফ" এ সেট করার পরামর্শ দেওয়া হয় recommended
এভেজেনি

4
এক্সকোডের তথ্য বার্তায় পরামর্শ দেওয়া হয়েছে যে: " @objcসুইফট 4 মোডে সুইফ্ট 3 অনুমানের ব্যবহার অবচয় করা হয়েছে Please অনুগ্রহ করে অনুমিত @objcমূল্যায়ন সতর্কতাগুলি সম্বোধন করুন," কোড অবহেলিত সুইফট 3 @objcঅনুমিতির ব্যবহার "লগিং সক্ষম করে আপনার কোডটি পরীক্ষা করুন এবং সুইফট 3 অনুমিতি অক্ষম করুন @objc" " উক্ত সুইফট 3 @objcইনফারেন্স লগিং সক্ষম করার কোন ধারণা ?
কোর্টউইলক

4
@ কাউন্টারউইলক, সুইফ্ট প্রস্তাব অনুসারে, লগগুলিতে অবজেক্টিভ-সি প্রবেশের পয়েন্টগুলির ব্যবহারগুলি দেখতে 1 থেকে 3 পর্যন্ত মান পরিবর্তনকারী SWIFT_DEBUG_IMPLICIT_OBJC_ENTRYPOINT সেট করতে পারবেন।
এভেজেনি

14
কেবল যোগ করার জন্য - আপনাকে কেবলমাত্র প্রকল্প নয়, সমস্ত বিল্ড টেজেটগুলির জন্য এটি করতে হবে।
ক্রিভভেনজ

270

- @objcঅনুমান কি ? কি হচ্ছে?

ইন Swift 3, সংকলকটি @objcবেশ কয়েকটি জায়গায় অনুমান করে যাতে আপনার দরকার হয় না। অন্য কথায়, এটি @objcআপনার জন্য যোগ করা নিশ্চিত করে !

ইন Swift 4, সংকলক আর এটি করে না (যত বেশি)। আপনাকে এখন @objcস্পষ্টভাবে যুক্ত করতে হবে ।

ডিফল্টরূপে, আপনার যদি প্রাক-সুইফট 4 প্রকল্প থাকে তবে আপনি এই সম্পর্কে সতর্কতা পাবেন। একটি সুইফট 4 প্রকল্পে আপনি বিল্ড ত্রুটি পাবেন। এটি SWIFT_SWIFT3_OBJC_INFERENCEবিল্ড সেটিংসের মাধ্যমে নিয়ন্ত্রণ করা হয় । প্রাক-সুইফট 4 প্রকল্পে এটি সেট করা আছে Onআমি এটি Default(বা Off) এ সেট করার পরামর্শ দেব যা এখন নতুন প্রকল্পের ডিফল্ট বিকল্প।

সবকিছুকে রূপান্তর করতে কিছুটা সময় লাগবে, তবে এটি যেহেতু সুইফট 4-এর জন্য ডিফল্ট, তাই এটি করা মূল্যবান।

- আমি কীভাবে সংকলক সতর্কতা / ত্রুটি বন্ধ করব?

আপনার কোড রূপান্তর করতে দুটি উপায় আছে যাতে সংকলক অভিযোগ না করে।

একটি হ'ল @objcপ্রতিটি ফাংশন বা ভেরিয়েবলের উপর ব্যবহার করা যা উদ্দেশ্য-সি রানটাইমের সংস্পর্শে আসা দরকার:

@objc func foo() {

}

অন্যটি হ'ল ঘোষণা @objcMembersদ্বারা ব্যবহার করা Class। এটি শ্রেণিতে সমস্ত ফাংশন এবং ভেরিয়েবল স্বয়ংক্রিয়ভাবে যুক্ত @objcকরার বিষয়টি নিশ্চিত করে । এটি সহজ উপায়, তবে এটির একটি ব্যয় রয়েছে, উদাহরণস্বরূপ, এটি ফাংশনগুলি প্রকাশের দ্বারা আপনার অ্যাপ্লিকেশনটির আকার বাড়াতে পারে যা প্রকাশের প্রয়োজন হয় নি।

@objcMembers class Test {

}

- কি @objcএবং কেন এটি প্রয়োজনীয়?

আপনি যদি একটি সুইফ্ট ক্লাসে নতুন পদ্ধতি বা ভেরিয়েবলগুলি প্রবর্তন করেন তবে সেগুলিকে চিহ্নিত করে @objcওপজেক্টিভ-সি রানটাইমটিতে প্রকাশ করে। আপনি উদ্দেশ্য সি কোড আপনার সুইফট বর্গ ব্যবহার করে, বা, যদি আপনি চান উদ্দেশ্য সি-টাইপ বৈশিষ্ট্য ব্যবহার করছেন থাকে তখন এই প্রয়োজনীয় Selectors। উদাহরণস্বরূপ, লক্ষ্য-অ্যাকশন প্যাটার্ন: button.addTarget(self, action:#selector(didPressButton), for:.touchUpInside)

- আমি কেন সব কিছু চিহ্নিত করব না @objc?

এমন কিছু নেতিবাচক রয়েছে যা কিছু চিহ্নিত করার সাথে আসে @objc:

  • বাইনারি আকারের বর্ধিত অ্যাপ্লিকেশন
  • কোনও ফাংশন ওভারলোডিং নেই

দয়া করে মনে রাখবেন যে এটি খুব উচ্চ-স্তরের সংক্ষিপ্তসার এবং এটি আমার লেখার চেয়ে জটিল। আমি আরও তথ্যের জন্য আসল প্রস্তাবটি পড়ার সুপারিশ করব।

সূত্র:


@objcগতিশীল প্রেরণ বোঝায় না, সুইফট স্থিতিশীল বা ভার্চুয়াল প্রেরণ (এবং সম্ভবত পৃথক কোড কার্যকরভাবে কার্যকর করতে পারে) ব্যবহার করতে মুক্ত use dynamicশব্দ গতিশীল প্রেরণ ব্যবহার করতে সুইফট বলপূর্বক প্রয়োজন।
কেভিন

7
বোতামে ক্রিয়া যুক্ত করার অন্যান্য উপায় আছে কি? যদি @objcচিত্রিত হয় তবে আমাদের কী ব্যবহার করা উচিত?
Aznix

5
@ স্টেফান হ্যাঁ, রূপান্তর করতে বেশ কিছুটা সময় থাকতে পারে। এটি পর্যায়ে বিভক্ত করুন। ত্যাগ SWIFT_SWIFT3_OBJC_INFERENCEOn। সুইফটে ৪ এ রূপান্তর করুন Then তারপরে স্টাফগুলি সামলান @objc। এটিকে সহজ করার জন্য, মৌলিক নিয়মগুলি অনুসরণ করুন: যদি সুইফ্ট ক্লাসটি ওবজেসি-সি কোডে (ব্রিজিং শিরোলেকের মাধ্যমে) ব্যবহৃত হয় @objcMembers, অন্যথায়, একের পর এক যোগ করুন @objc। কোনও .mফাইল থেকে সুইফ্ট শ্রেণি কল করা হয়েছে কিনা তা সন্ধান করতে কেবল এক্সকোড অনুসন্ধান ব্যবহার করুন। এটি রূপান্তর তুলনামূলকভাবে বেদাহীন করা উচিত।
kgaidis

5
@ ডালেক এই উত্তর গ্রহণ করা উচিত। সতর্কতা দমন করা এবং জিনিসগুলিকে সুইফ্ট 3-এ থাকায় কাজ করা একটি বিকল্প, তবে আইএমএইচও সবচেয়ে ভাল নয় not এটি @objcসুইচ 4 এ কেন পরিবর্তন হয়েছিল এবং তারপরে প্রকল্পটি ঠিক করার সিদ্ধান্ত নিয়েছে এবং এটি একই রাখবে তা বোঝা গুরুত্বপূর্ণ ।
derpoliuk

2
এই সংক্ষিপ্ত ব্যাখ্যার জন্য ধন্যবাদ
শ্মৌদি

48

অভিবাসী আপনার সমস্ত ফাংশন শনাক্ত করতে পারবেন না যেগুলিকে @objc ইনফারেড অবজেক্টিভ-সি ভাণ্ডারগুলি চিহ্নিত করে আপনাকে খুঁজে পেতে সহায়তা করার জন্য অবহিত হিসাবে চিহ্নিত করা হয়েছে dep অবহেলিত
পদ্ধতিগুলি সম্পর্কে সতর্কতা তৈরি করা
re অবহেলিত থাঙ্কগুলি চালনা করার সময় কনসোল বার্তা

এখানে চিত্র বর্ণনা লিখুন


1
সুতরাং @objc দিয়ে আমার কী করা উচিত? এটা মুছুন? এটা ছেড়ে দাও? আমি ইতিমধ্যে এটি অপসারণ করেছি। এবং আমি এই সতর্কতা পেয়েছিলাম তাই আমি তাদের যুক্ত করতে পারি? যে পদক্ষেপ 3 আমি এটি সঙ্গে করা উচিত?
শিয়াল করুন

বিনোদনের ঠিক আগে @objc যোগ করুন
হাসান তালেব

1
3 ধাপ কি সব সম্পর্কে? আপনি কিছু বিবরণ যোগ করতে পারেন :)
শীল

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

12

আমার এই সতর্কতাটি "সুইফট 3 @objc ইনফারেন্স" = "ডিফল্ট" সেটিং দিয়ে ছিল। তখন আমি বুঝতে পারি যে প্রকল্পের জন্য সেট করা হয়েছিল - লক্ষ্যটির জন্য নয়। সুতরাং, সতর্কতা থেকে মুক্তি পেতে আপনার লক্ষ্যতে "ডিফল্ট" সেটিংস রয়েছে তা নিশ্চিত করুন।


আমি প্রকল্পের সেটিংসে ডিফল্ট হয়ে যাওয়ার পরেও ত্রুটিটি সমাধান করার জন্য আমি 20 মিনিট নষ্ট করেছি। আপনি ঠিক এটি লক্ষ্য পরিবর্তন করতে হবে ঠিক চিহ্নিত।
স্ক্রুএভারিথিং

8

আপনি কেবল "চালু" পরিবর্তে "ডিফল্ট" এ যেতে পারেন। অ্যাপল যুক্তির আরও অনুগত বলে মনে হচ্ছে।

(তবে ব্যবহার সম্পর্কে অন্যান্য সমস্ত মন্তব্য @objকার্যকর রয়েছে))


7

প্রকৃতপক্ষে, আপনি সুইফট 3 @objc ইনফারেন্সটি অক্ষম করে সেই সতর্কতাগুলি থেকে মুক্তি পাবেন। তবে সূক্ষ্ম সমস্যাগুলি পপ আপ হতে পারে। উদাহরণস্বরূপ, কেভিও কাজ বন্ধ করবে। এই কোডটি সুইফট 3 এর অধীনে পুরোপুরি কাজ করেছিল:

for (key, value) in jsonDict {
    if self.value(forKey: key) != nil {
        self.setValue(value, forKey: key)
    }
}

সুইফট 4 এ স্থানান্তরিত করার পরে এবং "সুইফ্ট 3 @objc ইনফারেন্স" ডিফল্টরূপে সেট করার পরে , আমার প্রকল্পের কয়েকটি বৈশিষ্ট্য কাজ করা বন্ধ করে দিয়েছে । এর সমাধান পেতে আমার কিছু ডিবাগিং এবং গবেষণা লাগল। আমার সেরা জ্ঞান অনুসারে, এখানে বিকল্পগুলি রয়েছে:

  • "সুইফট 3 @ ওবজেসি ইনফারেন্সন" সক্ষম করুন (কেবলমাত্র আপনি যদি সুইফট 3 থেকে বিদ্যমান প্রকল্পটি স্থানান্তরিত করেন তবেই কাজ করে) এখানে চিত্র বর্ণনা লিখুন
  • @Objc হিসাবে প্রভাবিত পদ্ধতি এবং বৈশিষ্ট্যগুলি চিহ্নিত করুন এখানে চিত্র বর্ণনা লিখুন
  • @ObjcMeumber ব্যবহার করে পুরো শ্রেণীর জন্য ওবিজেসি অনুমিতিকে পুনরায় সক্ষম করুন এখানে চিত্র বর্ণনা লিখুন

@Objc অনুমানটিকে পুনরায় সক্রিয়করণ আপনাকে সতর্কবার্তা সহ ছেড়ে দেয় তবে এটির দ্রুত সমাধান। মনে রাখবেন এটি কেবল পূর্ববর্তী সুইফ্ট সংস্করণ থেকে স্থানান্তরিত প্রকল্পগুলির জন্য উপলব্ধ। অন্য দুটি বিকল্প আরও ক্লান্তিকর এবং কিছু কোড খনন এবং বিস্তৃত পরীক্ষার প্রয়োজন।

Https://github.com/apple/swift-evolution/blob/master/proposals/0160-objc-inferences.md এও দেখুন


7

আমি মাঝেমধ্যে আইওএস দেব (শীঘ্রই আরও কিছু হতে পারি) তবে আমি এখনও অন্য উত্তরের দ্বারা গাইড হিসাবে সেটিংটি খুঁজে পাইনি (যেহেতু উত্তরটিতে যে কীচেন আইটেমটি আমার কাছে নেই) তাই এখন আমি এটি খুঁজে পেয়েছি বলে ভেবেছিলাম আমি এই স্ন্যাপশটটি কেবল হাইলাইট করা লোকেশনগুলির সাথে যুক্ত করব যা আপনাকে ক্লিক করতে হবে এবং এটির সন্ধান করতে হবে।

  1. উপরের বাম দিকে শুরু করুন
  2. প্রকল্প ফোল্ডার আইকন চয়ন করুন
  3. প্রকল্প ফোল্ডার আইকনের নীচে আপনার মূল প্রকল্পের নামটি চয়ন করুন।
  4. ডান পাশের বিল্ড সেটিংস চয়ন করুন।
  5. টার্গেটের অধীনে আপনার প্রকল্পটি চয়ন করুন।
  6. খুব নিচে স্ক্রোল করুন (বা অনুসন্ধান পাঠ্যের বাক্সে শব্দটি অনুগ্রহ করে অনুসন্ধান করুন)

সেটিংস সন্ধান করা হচ্ছে


6

আপনি "পড আপডেট" এবং / অথবা "ঝাঁকুনি পরিষ্কার" চেষ্টা করতে পারেন

আমি এই সেটিংটি এক্সকোডেও সেট করে রেখেছি।

উদ্দেশ্য-সি ইন্টারফেস সেটিংটি নিম্নরূপ:

উদ্দেশ্য ইন্টারফেস সেটিং


2

সুইফ্ট 3 @ ওবজেসি ইনফারেন্সন সুইফট 4 মোডে সুইফ্ট 3 @ ওবজেসি ইনফারেন্সির ব্যবহার হ্রাস করা হয়েছে। অনুগ্রহ করে @objc অনুমানের সতর্কতাগুলিকে সম্বোধন করুন, "অবহেলিত সুইফট 3 @objc ইনফারেন্স ব্যবহার করুন" লগিং সক্ষম করে আপনার কোডটি পরীক্ষা করুন এবং তারপরে "এক্সএমএল পার্সিং URL" এর জন্য "সুইফট 3 @objc ইনফারেন্স" বিল্ড সেটিংটি "ডিফল্ট" এ পরিবর্তন করে অনুমিতি অক্ষম করুন লক্ষ্য।

পেয়েছিলাম

  1. প্রথম পদক্ষেপটি বিল্ড সেটিং পেয়েছে

  2. নির্ধারিত অনুমান তৈরি করতে অনুসন্ধান করুন

  3. সুইফট 3 @objc ইনফারেন্স ডিফল্ট পরিবর্তন করুন

এখানে চিত্র বর্ণনা লিখুন


1

আপনার কেবলমাত্র শেষ হওয়া অবধি পরীক্ষা চালানো দরকার, তারপরে বিল্ড সেটিং এ যান, সেটিং ইনফারেন্স তৈরি করতে অনুসন্ধান করুন, সুইচ 3 @ ওবজেসি ইনফারেন্স (ডিফল্ট) এ পরিবর্তন করুন। এটাই আমি করেছি এবং নিখুঁতভাবে কাজ করেছি।


0

সুইফট 4 মোডে সুইফ্ট 3 @ ওবজেসি অনুমিতির ব্যবহার অবচয়?

ফান কল @objc ব্যবহার করুন

func call(){

foo()

}

@objc func foo() {

}

0

@Wisiddo কি বলেছে তার উপরে, আপনি আপনার বিল্ড ফ্লেভারগুলির (যেমন ডিবাগ এবং রিলিজ) project.pbxprojপছন্দ হিসাবে ডিফল্ট হিসাবে সুইফট 3 @ ওবজে ইনফারেন্স সেট করেও ফাইলটিতে আপনার বিল্ড সেটিংস সংশোধন করতে পারেন SWIFT_SWIFT3_OBJC_INFERENCE = Default;, বিশেষত যদি আপনি অন্য কোনও পরিবেশ থেকে আসেন এক্সকোড ছাড়াও

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