আমি সুইট 4-তে # সিলেক্টর () এর সাথে @objc অনুমানের অবমূল্যায়নকে কীভাবে মোকাবিলা করতে পারি?


131

আমি আমার প্রকল্পের উত্স কোডটি সুইফট 3 থেকে সুইফট 4 এ রূপান্তর করার চেষ্টা করছি One একটি সতর্কতা এক্সকোড আমার নির্বাচকদের সম্পর্কে।

উদাহরণস্বরূপ, আমি নিয়মিত নির্বাচক ব্যবহার করে একটি বোতামে একটি লক্ষ্য যুক্ত করেছি:

button.addTarget(self, action: #selector(self.myAction), for: .touchUpInside)

এটি সতর্কতা এটি দেখায়:

'# নির্বাচক' এর যুক্তিটি 'ভিউকন্ট্রোলার'-এ' মেইকশন () 'উদাহরণ হিসাবে উল্লেখ করে যা সুইফট 4-এ অবনতিযুক্ত' @objc 'বৈশিষ্ট্য অনুকরণের উপর নির্ভর করে

উদ্দেশ্যমূলক-সিটিতে এই উদাহরণ পদ্ধতিটি প্রকাশ করতে '@objc' যুক্ত করুন

এখন, Fixত্রুটি বার্তাকে আঘাত করা আমার ফাংশনটিতে এটি করে:

// before
func myAction() { /* ... */ }

// after
@objc func myAction() { /* ... */ }

@objcচিহ্নটি অন্তর্ভুক্ত করার জন্য আমি আমার সমস্ত ক্রিয়াকলাপের নাম পরিবর্তন করতে চাই না এবং আমি ধরে নিচ্ছি যে এটি প্রয়োজনীয় নয়।

অবচয়কে হ্রাস করার জন্য আমি কীভাবে নির্বাচককে পুনর্লিখন করব?


সম্পর্কিত প্রশ্ন:


3
না, তাদের চিহ্নিত করার যেমন @objc হয় যাতে তাদের OBJ-C এক্সপোজ, সেইজন্য এবং নির্বাচকরা সঙ্গে ব্যবহার করার জন্য এখন প্রয়োজনীয়।
হামিশ

3
তাহলে অবহেলিত অংশটি পাবলিক অ্যাক্সেস ফাংশনগুলিকে অনুমান করছে @objc? এটি কিছুটা বিরক্তিকর, তবে আমি সাধারণত এই ফাংশনগুলি ব্যক্তিগত করি, @objcযাইহোক এটি আমাকে যেভাবেই চিহ্নিত করতে হবে ।
কনার

2
দেখুন দঃপূঃ-0160 পরিবর্তন বিষয়ে আরও তথ্যের জন্য। অন্য বিকল্প হ'ল আপনার প্রদত্ত শ্রেণিকে চিহ্নিত করা হচ্ছে @objcMembersযাতে ওবজ-সি এর সাথে সমস্ত ওবিজে-সি সামঞ্জস্যপূর্ণ সদস্যদের প্রকাশ করা যায়, তবে আমি আপনাকে উপদেশ দেব না যদি না আপনি সত্যিকার অর্থে আপনার পুরো ক্লাসটি উন্মুক্ত করার প্রয়োজন হয় না।
হামিশ

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

1
চেষ্টা করেছেন, কাজ করছেন না।
লিনাসগেফার্থ

উত্তর:


156

সংশোধনটি সঠিক - এটি নির্বাচক সম্পর্কে কিছুই নেই যা আপনি যে পদ্ধতিটি অবজেক্টিভ-সি এর সাথে সম্পর্কিত তা বোঝানোর পদ্ধতিটি তৈরি করতে পরিবর্তন করতে পারেন।

এই সতর্কতার প্রথম স্থানে পুরো কারণটি SE-0160 এর ফলাফল । সুইফট 4 এর আগে, internalবা NSObjectউত্তরাধিকারসূত্রে বর্ধিত শ্রেণির সুসংগত সদস্যদের অনুমিত করা হত @objcএবং তাই উদ্দেশ্য-সি-এর কাছে উন্মুক্ত করা হত , সুতরাং তাদের নির্বাচক ব্যবহার করে ডেকে আনা (যেমন পদ্ধতিটি অনুসন্ধানের জন্য ওবজ-সি রানটাইম প্রয়োজন হয়) প্রদত্ত নির্বাচকের জন্য বাস্তবায়ন)।

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

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

আপনি যদি কোনও সদস্যকে ওবজে-সি-তে প্রকাশ করতে চান তবে আপনাকে এটি হিসাবে চিহ্নিত করতে হবে @objc , উদাহরণস্বরূপ:

class ViewController: UIViewController {

    @IBOutlet weak var button: UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()
        button.addTarget(self, action: #selector(foo), for: .touchUpInside)
    }

    @objc func foo() {
       // ... 
    }
}

("মিনিমাইজ ইনফরমেশন" বাছাই করার সময় নির্বাচিতদের সাথে মাইগ্রেটরটি আপনার জন্য স্বয়ংক্রিয়ভাবে এটি নির্বাচন করা উচিত)

ওবজে-সি-তে একদল সদস্যকে প্রকাশ করতে, আপনি এগুলি ব্যবহার করতে পারেন @objc extension:

@objc extension ViewController {

    // both exposed to Obj-C
    func foo() {}
    func bar() {}
}

এটি ওবিজে-সি-তে সংজ্ঞায়িত সমস্ত সদস্যকে উন্মোচিত করবে এবং যে কোনও সদস্যকে ওবজে-সি-এর কাছে প্রকাশ করা যাবে না (ততক্ষণ স্পষ্টভাবে চিহ্নিত না করা @nonobjc) ত্রুটি দেবে ।

আপনার যদি এমন কোনও শ্রেণি থাকে যেখানে আপনার সমস্ত ওজ-সি সামঞ্জস্যপূর্ণ সদস্যদের ওবজে-সি এর সাথে প্রকাশ করার প্রয়োজন হয়, আপনি শ্রেণিটি চিহ্নিত করতে পারেন @objcMembers:

@objcMembers
class ViewController: UIViewController {
   // ...
}

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


2
কোডটি সর্বশেষ সিনট্যাক্সে রূপান্তর করার সময় কেন Xcode স্বয়ংক্রিয়ভাবে তা করে না?
লিনাসগেফার্থ

1
আমি ভাবছি, @IBActionনিজেও @objcকি? এটি এখন অবধি ছিল না তবে এটি যৌক্তিক হবে। সম্পাদনা: এনভিএম, প্রস্তাবটিতে পরিষ্কারভাবে বলা হয়েছে যে @IBActionকোনও পদ্ধতি হওয়ার পক্ষে যথেষ্ট @objc
সুলতান

8
আমি এর কোন কিছুই বুঝতে পারছি না। আমার আর কখনও উদ্দেশ্যমূলক-সি-কোড নেই। কোনও বোতামে লক্ষ্য যুক্ত করার কোনও শুদ্ধ সুইফট-উপায় নেই? বা নির্বাচক ব্যবহার? আমি চাই না যে আমার কোডগুলি এই বৈশিষ্ট্যের সাথে ছাঁটাই হোক। কোনও ইউআইবাটন কিছু এনএসবজেক্ট / ওবজ-সি-জিনিস থেকে প্রাপ্ত বলে এটি কি?
স্টি

11
@ স্টি তাই সরাসরি উত্তর দেওয়ার জন্য " কী কোনও বোতামে লক্ষ্য যুক্ত করার বিশুদ্ধ সুইফট-উপায় নেই? বা নির্বাচক ব্যবহার করবেন? " - না, পদ্ধতিতে প্রেরণের জন্য নির্বাচকদের ব্যবহার করার কোনও "খাঁটি সুইফ্ট" উপায় নেই। কোনও নির্দিষ্ট নির্বাচককে কল করার জন্য পদ্ধতিটি প্রয়োগকরণের জন্য তারা ওবিজে-সি রানটাইমের উপর নির্ভর করে - সুইফট রানটাইমের সেই ক্ষমতা নেই।
হামিশ

12
ম্যান সিলেক্টররা গোলযোগ। দেখে মনে হচ্ছে যে অন্যান্য সুইফট আপডেটগুলি তারা এটির সাথে বিশৃঙ্খলা করছে। কেন আমরা পদ্ধতিগুলির জন্য খাঁটি সুইফ্ট স্বয়ংসম্পূর্ণ নির্বাচনকারী থাকতে পারি না? কোডটিকে খুব কুৎসিত দেখায়।
জন রিসেলভাতো

16

অ্যাপল অফিসিয়াল ডকুমেন্টেশন হিসাবে । আপনার নির্বাচক পদ্ধতিটি কল করতে আপনাকে @objc ব্যবহার করতে হবে।

অবজেক্টিভ-সি-তে, কোনও নির্বাচক এমন এক প্রকার যা কোনও উদ্দেশ্য-সি পদ্ধতির নাম বোঝায়। সুইফটে, অবজেক্টিভ-সি নির্বাচকগুলি Selectorকাঠামোর দ্বারা প্রতিনিধিত্ব করা হয় , এবং #selector এক্সপ্রেশনটি ব্যবহার করে নির্মিত যেতে পারে । একটি পদ্ধতি যে উদ্দেশ্য সি থেকে বলা যেতে পারে একটি নির্বাচক তৈরি করতে হলে, যেমন পদ্ধতি, নাম পাস #selector(MyViewController.tappedButton(sender:))। একটি সম্পত্তি এর উদ্দেশ্য সি সংগ্রহকারী বা সেটার পদ্ধতির জন্য একটি নির্বাচক গঠন করা, দ্বারা পূর্বে সমাধান সম্পত্তি নাম পাস getter:বা setter:যেমন লেবেল, #selector(getter: MyViewController.myButton)


এগুলি থেকে আমি যা বুঝতে পারি তা হ'ল কিছু ক্ষেত্রে আমার কাছে @objc যুক্ত করা দরকার যা আমি কখনই উদ্দেশ্য-সি থেকে এটিকে ডাকব কিনা। আমি
স্যুইটটি

10

হিসাবে, আমি মনে করি সুইফট ৪.২, আপনার যা করতে হবে তা হ'ল আপনার আইডিয়াকে @ আইবিএশন বরাদ্দ করা এবং আপনি এই নির্বোধ @ ওবিজেসি টিকাটি এড়াতে পারবেন

``

let tap  =  UITapGestureRecognizer(target: self, action: #selector(self.cancel))


@IBAction func cancel()
{
    self.dismiss(animated: true, completion: nil)
}

1
এটি ইন্টারফেস বিল্ডারকেও বলবে যে এই ফাংশনটি সংযুক্ত হতে পারে, যা আপনি যা চান তা নাও হতে পারে। এটি @objc হিসাবে একই জিনিস করছে।
জোশ প্যারাড্রয়েড

2

ইতিমধ্যে অন্যান্য উত্তরে যেমনটি উল্লেখ করা হয়েছে, এড়ানো কোনও উপায় নেই @objc নির্বাচকদের জন্য টীকাটি ।

তবে ওপিতে বর্ণিত সতর্কতা নীচের পদক্ষেপগুলি গ্রহণ করে নিঃশব্দ করা যেতে পারে:

  1. যাও বিল্ড সেটিংসে
  2. কীওয়ার্ড অনুসন্ধান করুন @Objc
  3. মান সেট সুইফট 3 @objc ইন্টারফেস থেকেOff

নীচে স্ক্রিনশট যা উপরে বর্ণিত পদক্ষেপগুলি তুলে ধরে:

"সুইফট 3 @objc ইন্টারফেস" সতর্কতা নিঃশব্দ করা হচ্ছে

আশাকরি এটা সাহায্য করবে


এটি কীভাবে বড় ছবিতে আপনার প্রকল্পকে প্রভাবিত করে?
জোনিলি জামে

1
* * আইপা বা * .আর্কাইভ আকার এবং বিল্ড টাইম সম্পর্কে কীভাবে?
জোনিলি জামে

@ জোনিলিজেমে আমি নির্মাণের সময়টি লক্ষ্য করিনি, তবে আইপিএ আকারে কোনও প্রভাব
পড়েনি

এটি অ্যাপল নির্দেশিকা অনুসারে আপনি যদি সুইফট ৪০++ সংস্করণ ব্যবহার করেন তবে আপনি যে মানটি ব্যবহার করতে পারবেন তা পুনরুদ্ধারযোগ্য মান নয়। এই সহায়তাটি
এক্সকোড /

1
আপনি এক্সকোড ১১-এ ডিফল্টে মান সেট করে এই উত্তরটি আপডেট করতে পারেন the সাবধানবাণীটি সম্পূর্ণরূপে অপসারণ করার জন্য প্রকল্প এবং আপনার লক্ষ্য উভয়কেই মূল্য নির্ধারণ করা গুরুত্বপূর্ণ।
টমি সি।

2

আপনার ভিউ কন্ট্রোলারে যদি উদ্দেশ্য সি সদস্যের প্রয়োজন হয় তবে কেবলমাত্র ভিউ কন্ট্রোলারের শীর্ষে @objcMeumber যুক্ত করুন । এবং আপনি আপনার কোডে আইবিএક્શન যুক্ত করে এড়াতে পারেন।

@IBAction func buttonAction() {

}

স্টোরবোর্ডে এই আউটলেটটি সংযুক্ত করার বিষয়টি নিশ্চিত করুন।

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