সুইফট নিজেই নির্বাচকদের ব্যবহার করে না - বেশ কয়েকটি ডিজাইনের নিদর্শন যা সিলেক্টর সিলেক্টরগুলি সুইফটে আলাদাভাবে কাজ করে। (উদাহরণস্বরূপ, প্রোটোকল প্রকারের পরিবর্তে বা is/ asপরীক্ষায় onচ্ছিক শৃঙ্খলা ব্যবহার করুন respondsToSelector:এবং performSelector:আরও ভাল টাইপ / মেমরির সুরক্ষার পরিবর্তে আপনি যেখানেই পারেন ক্লোজারগুলি ব্যবহার করুন ))
তবে এখনও অনেকগুলি গুরুত্বপূর্ণ ওবিসিসি ভিত্তিক এপিআই রয়েছে যা টাইমার এবং লক্ষ্য / ক্রিয়া প্যাটার্ন সহ নির্বাচক ব্যবহার করে। Selectorএইগুলির সাথে কাজ করার জন্য সুইফট প্রকারটি সরবরাহ করে । (ওবিজেসির SELধরণের স্থানে সুইফট স্বয়ংক্রিয়ভাবে এটি ব্যবহার করে ))
সুইফট ২.২ (এক্সকোড .3.৩) এবং তারপরে (সুইফট 3 / এক্সকোড 8 এবং সুইফট 4 / এক্সকোড 9 সহ):
আপনি এক্সপ্রেশনটি Selectorব্যবহার করে একটি সুইফট ফাংশন টাইপ থেকে একটি নির্মাণ করতে পারেন #selector।
let timer = Timer(timeInterval: 1, target: object,
selector: #selector(MyClass.test),
userInfo: nil, repeats: false)
button.addTarget(object, action: #selector(MyClass.buttonTapped),
for: .touchUpInside)
view.perform(#selector(UIView.insertSubview(_:aboveSubview:)),
with: button, with: otherButton)
এই পদ্ধতির সম্পর্কে দুর্দান্ত জিনিস? একটি ফাংশন রেফারেন্সটি সুইফ্ট সংকলক দ্বারা পরীক্ষা করা হয়, সুতরাং আপনি #selectorকেবলমাত্র শ্রেণি / পদ্ধতিযুক্ত জোড়গুলির সাথে অভিব্যক্তিটি ব্যবহার করতে পারেন যা বাস্তবে বিদ্যমান এবং নির্বাচক হিসাবে ব্যবহারের জন্য যোগ্য (নীচে "নির্বাচক প্রাপ্যতা" দেখুন)। ফাংশন-ধরণের নামকরণের সুইফট ২.২+ নিয়ম অনুসারে আপনার ফাংশনটিকে কেবল আপনার প্রয়োজন অনুসারে রেফারেন্স হিসাবে নির্দ্বিধায় মুক্ত করতে পারেন ।
(এটি আসলে ওবিজির @selector()নির্দেশনার চেয়ে উন্নতি , কারণ সংকলকটির চেকটি -Wundeclared-selectorকেবলমাত্র নির্বাচিত নির্বাচিত উপস্থিত রয়েছে তা #selectorযাচাই করে existence আপনি অস্তিত্ব, ক্লাসে সদস্যপদ এবং স্বাক্ষর টাইপ করে যাচাই করেন সুইফট ফাংশন রেফারেন্স ))
আপনি যে #selectorঅভিব্যক্তিটিতে পাঠাচ্ছেন সেই ফাংশন রেফারেন্সের জন্য আরও কয়েকটি অতিরিক্ত সতর্কতা রয়েছে :
- একই বেস নামের একাধিক ফাংশন ফাংশন রেফারেন্সের জন্য পূর্বোক্ত সিনট্যাক্স ব্যবহার করে তাদের পরামিতি লেবেলের দ্বারা পৃথক করা যায় (যেমন
insertSubview(_:at:)বনাম insertSubview(_:aboveSubview:))। তবে যদি কোনও ফাংশনটির কোনও প্যারামিটার না থাকে তবে তা ছিন্ন করার একমাত্র উপায় হ'ল asফাংশনের ধরণের স্বাক্ষর (যেমন foo as () -> ()বনাম foo(_:)) সহ একটি কাস্ট ব্যবহার করা ।
- সুইফট +.০+ তে প্রপার্টি গেটার / সেটার জোড়ার জন্য একটি বিশেষ সিনট্যাক্স রয়েছে। উদাহরণস্বরূপ, একটি দেওয়া
var foo: Int, আপনি ব্যবহার করতে পারেন #selector(getter: MyClass.foo)বা #selector(setter: MyClass.foo)।
সাধারণ নোট:
মামলাগুলি যেখানে #selectorকাজ করে না, এবং নামকরণ করে না: কখনও কখনও আপনার সাথে কোনও নির্বাচক তৈরি করার জন্য কোনও ফাংশন রেফারেন্স থাকে না (উদাহরণস্বরূপ, ওজজিসি রানটাইমটিতে গতিশীলভাবে নিবন্ধিত পদ্ধতি সহ)। সেক্ষেত্রে আপনি Selectorএকটি স্ট্রিং থেকে একটি নির্মাণ করতে পারেন : উদাহরণস্বরূপ Selector("dynamicMethod:")- যদিও আপনি সংকলকের বৈধতা যাচাই হারিয়েছেন। আপনি যখন এটি করেন, আপনাকে :প্রতিটি প্যারামিটারের জন্য কলোন ( ) সহ ওবিজেসি নামকরণের নিয়ম অনুসরণ করতে হবে ।
নির্বাচকের প্রাপ্যতা: নির্বাচক দ্বারা বর্ণিত পদ্ধতিটি অবশ্যই ObjC রানটাইমের সংস্পর্শে আসতে হবে। সুইফট 4-এ, ওবিজেসি-এর কাছে প্রকাশিত প্রতিটি পদ্ধতির অবশ্যই তার ঘোষণাটি অবশ্যই গুনের সাথে থাকা উচিত @objc। (পূর্ববর্তী সংস্করণগুলিতে আপনি কিছু ক্ষেত্রে এই বৈশিষ্ট্যটি নিখরচায় পেয়েছিলেন তবে এখন আপনাকে এটি স্পষ্টভাবে ঘোষণা করতে হবে))
মনে রাখবেন যে privateচিহ্নগুলি রানটাইমের সাথেও প্রকাশিত হয় না - আপনার পদ্ধতির কমপক্ষে internalদৃশ্যমানতা থাকা দরকার।
মূল পথ: এগুলির সাথে সম্পর্কিত তবে নির্বাচকদের মতো নয়। এগুলির জন্য সুইফট 3-তে একটি বিশেষ বাক্য গঠন রয়েছে: যেমন chris.valueForKeyPath(#keyPath(Person.friends.firstName))। বিশদ জানতে SE-0062 দেখুন । এবং আরও KeyPathসুইফট 4 এ আরও স্টাফ , তাই আপনি যদি উপযুক্ত হন তবে নির্বাচকদের পরিবর্তে সঠিক কীপথ ভিত্তিক এপিআই ব্যবহার করছেন তা নিশ্চিত করুন।
আপনি অধীনে নির্বাচকরা সম্বন্ধে আরও পড়তে পারেন উদ্দেশ্য সি API গুলি সাথে আলাপচারিতার মধ্যে কোকো এবং উদ্দেশ্য সি সঙ্গে সুইফট ব্যবহার ।
দ্রষ্টব্য: সুইফট ২.২ এর আগে Selectorকনফর্ম করা হয়েছে StringLiteralConvertible, সুতরাং আপনি পুরানো কোডটি খুঁজে পেতে পারেন যেখানে নির্বাচকদের নেওয়া এআইপিগুলিতে খালি স্ট্রিংগুলি দেওয়া হয়। আপনি যেগুলি ব্যবহার করছেন তা পেতে এক্সকোডে "কনভার্ট টু কারেন্ট সুইট সিন্ট্যাক্স" চালাতে চান #selector।
selector: test()কলtestএবংselectorআর্গুমেন্ট তার ফিরে মান পাস হবে ।