অবজেক্টিভ-সিতে নির্বাচকরা?


122

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

দ্বিতীয়ত, এই মুহুর্তে, আমার কাছে নিম্নলিখিত কোড রয়েছে:

NSString *thing = @"Hello, this is Craig";

SEL sel = @selector(lowercaseString:);
NSString *lower = (([thing respondsToSelector:sel]) ? @"YES" : @"NO");
NSLog (@"Responds to lowercaseString: %@", lower);
if ([thing respondsToSelector:sel]) //(lower == @"YES")
    NSLog(@"lowercaseString is: %@", [thing lowercaseString]);

তবে, যদিও thingএটি স্পষ্টতই এক ধরণের এনএসএসস্ট্রিং, এবং ছোট ছোট স্ট্রিংয়ের প্রতিক্রিয়া হওয়া উচিত, আমি "ইয়েস" ফেরত দেওয়ার জন্য শর্তসাপেক্ষে 'রেসপন্সটোসলেক্টর' পেতে পারি না ...


আপনি অ্যাপল বিকাশকারী সাইটে নির্বাচক বিবরণটি পড়তে চান: নির্বাচক
লোথার

14
স্ট্যানফোর্ড কোর্স CS193P অ্যাসাইনমেন্ট 1 বি? আমার ঠিক এখানে একই প্রশ্ন! :)
করস্টিয়ান বোর্ম্যান

উত্তর:


181

পদ্ধতির নামগুলি সম্পর্কে আপনাকে খুব সাবধানতা অবলম্বন করতে হবে। এই ক্ষেত্রে, পদ্ধতির নামটি কেবল " lowercaseString" নয়, " lowercaseString:" নয় (কোলনের অনুপস্থিতিতে নোট করুন)। এজন্য আপনি NOফিরে আসছেন, কারণ NSStringবস্তুগুলি lowercaseStringবার্তায় সাড়া দেয় তবে বার্তাটি নয় lowercaseString:

কোলন যুক্ত করার সময় আপনি কীভাবে জানবেন? আপনি বার্তার নামটিতে একটি কলোন যুক্ত করেন যদি আপনি কল করার সময় কোনও কোলন যুক্ত করেন, এটি ঘটে যদি একটি যুক্তি লাগে। যদি এটি শূন্য আর্গুমেন্ট নেয় (যেমনটি হয় lowercaseString), তবে কোনও কোলন নেই। যদি এটি একাধিক আর্গুমেন্ট নেয়, তবে আপনাকে তাদের কলোনের পাশাপাশি অতিরিক্ত যুক্তির নাম যুক্ত করতে হবে compare:options:range:locale:

আপনি ডকুমেন্টেশনটিও দেখতে পারেন এবং একটি পিছনের কোলনের উপস্থিতি বা অনুপস্থিতি নোট করতে পারেন ।


12

সংকলকগণ সরাসরি সংকলিত কোডে পদ্ধতিগুলি উল্লেখ করার একটি দক্ষ উপায় - সংকলকটি আসলে কোনও এসইএলকে মূল্য নির্ধারণ করে।

অন্যরা ইতিমধ্যে আপনার q এর দ্বিতীয় অংশটি coveredেকে ফেলেছে, শেষে '': আপনি যা খুঁজছেন তার চেয়ে আলাদা স্বাক্ষরের সাথে মেলে (এই ক্ষেত্রে স্বাক্ষরটির অস্তিত্ব নেই)।


10

আপনি চান @selector(lowercaseString)না, কারণ @selector(lowercaseString:)। একটি সূক্ষ্ম পার্থক্য আছে: দ্বিতীয়টি একটি প্যারামিটার বোঝায় (শেষে কোলনটি নোট করুন), তবে - [NSString lowercaseString]প্যারামিটার গ্রহণ করে না।


5

এক্ষেত্রে নির্বাচকটির নাম ভুল। এখানে কোলন পদ্ধতিটির স্বাক্ষরের অংশ; এর অর্থ হল যে পদ্ধতিটি একটি যুক্তি নেয়। আমি বিশ্বাস করি যে আপনি চান

SEL sel = @selector(lowercaseString);


1

কোলনটিকে ফাংশন নামের অংশ হিসাবে ভাবেন না, এটি পৃথককারী হিসাবে ভাবেন, যদি আপনার আলাদা করার মতো কিছু না থাকে (ফাংশনটির সাথে যাওয়ার কোনও মূল্য নেই) তবে আপনার এটির দরকার নেই।

আমি নিশ্চিত না কেন তবে এই সমস্ত ওও স্টাফ অ্যাপল বিকাশকারীদের কাছে বিদেশী বলে মনে হচ্ছে। আমি দৃ strongly়ভাবে ভিজ্যুয়াল স্টুডিও এক্সপ্রেস দখল করার পরামর্শ দিচ্ছি এবং এটির সাথেও চারপাশে খেলতে চাই। একজনের চেয়ে অন্যটির চেয়ে ভাল নয়, এটি ডিজাইনের সমস্যাগুলি এবং চিন্তাভাবনার উপায়গুলি দেখার জন্য এটি একটি ভাল উপায়।

মত

introspection = reflection
+ before functions/properties = static
- = instance level

সমস্যাটি বিভিন্ন উপায়ে দেখতে সর্বদা ভাল এবং প্রোগ্রামিংই চূড়ান্ত ধাঁধা।


0

অ্যাপল ডকুমেন্টেশন সম্পর্কে আমার বোঝাপড়া থেকে, কোনও নির্বাচক আপনি যে পদ্ধতিতে কল করতে চান তার নাম উপস্থাপন করে। নির্বাচকদের সম্পর্কে দুর্দান্ত জিনিসটি হ'ল আপনি যেসব ক্ষেত্রে ডাকা যেতে হবে তার সঠিক পদ্ধতি পরিবর্তিত হয় সে ক্ষেত্রে আপনি সেগুলি ব্যবহার করতে পারেন। একটি সাধারণ উদাহরণ হিসাবে, আপনি যেমন কিছু করতে পারেন:

SEL selec;
if (a == b) {
selec = @selector(method1)
}
else
{
selec = @selector(method2)
};
[self performSelector:selec];

0

অ্যাপল ডক্স অনুসারে: https://developer.apple.com/library/archive/docamentation/ জেনারাল / কনসেপ্টুয়াল / ডেভপিডিয়া- কোকো কোর / নির্বাচনকারী html

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

উদাহরণ: (lldb) ব্রেকপয়েন্ট - সেট নির্বাচনকারী ভিডডিডলড

এটি আপনার অ্যাপ্লিকেশনটিতে সমস্ত দর্শনডিলডোড বাস্তবায়নগুলিতে একটি ব্রেকপয়েন্ট সেট করবে। সুতরাং নির্বাচক কোনও পদ্ধতির জন্য বিশ্বব্যাপী শনাক্তকারী is

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