ios - সুইফট চায়#নির্বাচকের যুক্তিটি উদ্দেশ্য-সি-এর কাছে প্রকাশিত হোক



objective-c xcode (2)

আমার একটি সুইফ্ট প্রকল্প রয়েছে যেখানে আমি একটি ইউআইবাটনের ট্যাপ ইভেন্টে একটি পদ্ধতি সংযুক্ত করতে চাই। আমার কাছে নিম্নলিখিত কোড রয়েছে:

class MyClass {
  let myButton = UIButton(frame: CGRectMake(50, 50, 100, 50))
  init() {
    myButton.addTarget(self, #selector(self.didTap(_:)), forControlEvents: .TouchUpInside)
  }

  func didTap(sender: UIButton) {
    print("Tapped")
  }
}

addTarget আমার addTarget লাইনটি হাইলাইট করে এবং বলে:

Argument of '#selector' refers to a method that is not exposed to Objective-C

যদি আমি আমার func didTap মতো @objc উপসর্গটি যুক্ত করি তবে এর @objc আছে তবে সবকিছু ঠিক আছে।

আমার বিল্ড সেটিংসে এমন কিছু সক্ষম আছে যা এই অদ্ভুত আচরণের কারণ হয়ে উঠছে?

গীত। আমি এই আচরণটি 7.3.1 এ পেয়েছি। তবে আমি যদি 7.2.1 এ চেষ্টা করি তবে এটি #selector(method(_:)) সিনট্যাক্স গ্রহণ করে না এবং Selector("method:") কাজ করে।

https://ffff65535.com


যদি আমি আমার didTap মতো @objc উপসর্গটি যুক্ত করি তবে এর মতামত আছে তবে সবকিছু ঠিক আছে।

আমার বিল্ড সেটিংসে এমন কিছু সক্ষম আছে যা এই অদ্ভুত আচরণের কারণ হয়ে উঠছে?

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

এবং নির্বাচক ("পদ্ধতি:") ভাল কাজ করে

সুইফ্টের পূর্ববর্তী সংস্করণগুলিতে, সংকলক আপনাকে এই পরিস্থিতিতে সহায়তা করবে না, সুতরাং আপনার কোডটি সংকলন করবে। বার্তাটি উপস্থিত হওয়ার পরে আপনি ক্র্যাশ হয়ে যেতেন এবং উদ্দেশ্য-সি পদ্ধতিটি খুঁজে পেলেন না। #selector সিনট্যাক্সের পুরো পয়েন্টটি আপনাকে সেই #selector এড়াতে সহায়তা করে। এবং এটি কি এটা কি!


আপনাকে NSObject থেকে সাবক্লাস করতে হবে





swift