আমি কীভাবে একাধিক পরামিতিগুলি উদ্দেশ্য-সিতে পাস করব?


178

আমি উদ্দেশ্য-সি পদ্ধতির বাক্য গঠন সম্পর্কে বেশ কয়েকটি পোস্ট পড়েছি তবে আমার ধারণা আমি কোনও পদ্ধতির একাধিক নাম বুঝতে পারি না।

আমি একটি পদ্ধতি বলা তৈরি করার চেষ্টা করছি getBusStopsসঙ্গে NSStringএবং NSTimeIntervalপরামিতি এবং একটি রিটার্ন টাইপ NSMutableArray। এইভাবেই আমি পদ্ধতিটি তৈরি করেছি তবে এটি রানটাইমে অবশ্যই ত্রুটি পেয়েছে:

- (NSMutableArray *)getBusStops:(NSString *)busStop
                                (NSTimeInterval *)timeInterval;

আমি একটি পদ্ধতির সাথে আরও একটি উদাহরণ দেখেছি:

-(NSInteger)pickerView:(UIPickerView *)pickerView
            numberOfRowsInComponent:(NSInteger)component

আমি বুঝতে পারি না কেন এই পদ্ধতির প্রতিটি প্যারামিটারের একটি পদ্ধতির নাম রয়েছে। আমার কি এমন কিছু করা উচিত:

- (NSMutableArray *)getBusStops:(NSString *)busStop
                        forTime:(NSTimeInterval *)timeInterval

উত্তর:


120

অবজেক্টিভ-সি এর প্যারামিটারগুলির নাম নেই, সুতরাং কোলনের বাম পাশে থাকা সমস্ত কিছুই পদ্ধতিটির নামের একটি অংশ। উদাহরণ স্বরূপ,

getBusStops: forTime:

পদ্ধতির নাম। নামটি ভেঙে গেছে তাই এটি আরও বর্ণনামূলক হতে পারে। আপনি কেবল আপনার পদ্ধতির নাম রাখতে পারেন

getBusStops: :

তবে এটি আপনাকে দ্বিতীয় প্যারামিটার সম্পর্কে বেশি কিছু জানায় না।


157

আপনার প্রতিটি প্যারামিটারের নাম খুব কমপক্ষে একটি ":" দিয়ে সীমাবদ্ধ করতে হবে। প্রযুক্তিগতভাবে নামটি isচ্ছিক, তবে এটি পঠনযোগ্যতার জন্য প্রস্তাবিত। সুতরাং আপনি লিখতে পারেন:

- (NSMutableArray*)getBusStops:(NSString*)busStop :(NSSTimeInterval*)timeInterval;

বা আপনি যা পরামর্শ দিয়েছেন:

- (NSMutableArray*)getBusStops:(NSString*)busStop forTime:(NSSTimeInterval*)timeInterval;

15
+1: অবজেক্টিভ-সি ফাংশন যুক্তি প্রকৃতপক্ষে অবস্থানগত, নাম নয়, সুতরাং লেবেলটি alচ্ছিক এবং মানুষের ব্যবহারের জন্য।
জারেট হার্ডি

নিশ্চিত নন কেন "ফর্মটাইম" স্বাক্ষরে অগ্রাধিকার দেওয়া হয়েছে, "টাইমইন্টারভাল" ফাংশনে দ্বিতীয় প্যারামিটার হিসাবে ব্যবহার করা যেতে পারে, তাই না?
গ্যালাকটিকা

@ গ্যালাকটিকা - অবশ্যই, নামটি যা আপনার পক্ষে সর্বাধিক অর্থবোধ করে তা হতে পারে। এই উদাহরণটি ধারাবাহিকতার জন্য ওপি'র পরিভাষা ব্যবহার করে।
ইএম

2
এখনও নিশ্চিত না কি জন্য forTimeব্যবহার করা হয়?
mrgloom

71

হ্যাঁ; উদ্দেশ্যগত-সি পদ্ধতির বাক্য গঠনটি বেশ কয়েকটি কারণে এই জাতীয়; এর মধ্যে একটি হ'ল যাতে আপনার নির্দিষ্ট করা পরামিতিগুলি কী তা স্পষ্ট। উদাহরণস্বরূপ, আপনি যদি NSMutableArrayকোনও নির্দিষ্ট সূচকে কোনও অবজেক্ট যুক্ত করে থাকেন তবে আপনি এটি পদ্ধতিটি ব্যবহার করে করবেন:

- (void)insertObject:(id)anObject atIndex:(NSUInteger)index;

এই পদ্ধতিটি বলা হয় insertObject:atIndex:এবং এটি স্পষ্ট যে কোনও নির্দিষ্ট সূচীতে একটি বস্তু সন্নিবেশ করা হচ্ছে।

অনুশীলনে, "হ্যালো, ওয়ার্ল্ড!" স্ট্রিং যুক্ত করুন সূচিতে একটি 5 NSMutableArrayনামক arrayনিম্নরূপ বলা যেতে হবে:

NSString *obj = @"Hello, World!";
int index = 5;

[array insertObject:obj atIndex:index];

এটি পদ্ধতির পরামিতিগুলির ক্রমের মধ্যেও অস্পষ্টতা হ্রাস করে, এটি নিশ্চিত করে যে আপনি প্রথমে বস্তুর প্যারামিটারটি পাস করেন, তারপরে সূচক পরামিতিটি। বিপুল সংখ্যক আর্গুমেন্ট গ্রহণকারী ফাংশনগুলি ব্যবহার করার সময় এটি আরও কার্যকর হয় এবং যুক্তিগুলি পাস করার ক্ষেত্রে ত্রুটি হ্রাস করে।

তদ্ব্যতীত, নামকরণের পদ্ধতিটি পদ্ধতিটি এমন কারণ কারণ উদ্দেশ্য-সি ওভারলোডিং সমর্থন করে না; তবে, আপনি যদি এমন একটি পদ্ধতি লিখতে চান যা একই কাজ করে তবে বিভিন্ন ডেটা-টাইপ গ্রহণ করে, এটি সম্পাদন করা যেতে পারে; উদাহরণস্বরূপ, NSNumberক্লাস গ্রহণ; এর বেশ কয়েকটি অবজেক্ট তৈরির পদ্ধতি রয়েছে, যার মধ্যে রয়েছে:

  • + (id)numberWithBool:(BOOL)value;
  • + (id)numberWithFloat:(float)value;
  • + (id)numberWithDouble:(double)value;

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


যদি ফাংশনের নামটিতে প্যারামিটারের নাম অন্তর্ভুক্ত থাকে তবে পদ্ধতি কল (বার্তা প্রেরণ) এর সময় প্যারামিটারের নামগুলি প্রয়োজনীয়?
নবীন

24

প্রতিটি প্যারামিটারের আগে লেখাটি পদ্ধতির নামের অংশ । আপনার উদাহরণ থেকে, পদ্ধতির নামটি আসলে

-getBusStops:forTime:

প্রতিটি: একটি যুক্তি উপস্থাপন করে। একটি পদ্ধতিতে, পদ্ধতিটির নামটি বিভক্ত হয়: s এবং যুক্তিগুলি: seg এর পরে উপস্থিত হয়

[getBusStops: arg1 forTime: arg2]

3
আমি মনে করি আপনি পদ্ধতির নাম যুক্ত করতে ভুলে গেছেন।
üzgür

11

পদ্ধতি তৈরির জন্য:

-(void)mymethods:(NSString *)aCont withsecond:(NSString *)a-second {
//method definition...
}

পদ্ধতি কল জন্য:

[mymethods:self.contoCorrente withsecond:self.asecond];

-3
(int) add: (int) numberOne plus: (int) numberTwo ;
(returnType) functionPrimaryName : (returnTypeOfArgumentOne) argumentName functionSecondaryNa

আমাকে:

(returnTypeOfSecontArgument) secondArgumentName ;

অন্যান্য ভাষাগুলির মতো আমরা নিম্নলিখিত সিনট্যাক্স অকার্যকর ব্যবহার করি add(int one, int second) তবে OBJ_cউপরে বর্ণিত অনুসারে আর্গুমেন্ট নির্ধারণের পদ্ধতিটি ভিন্ন

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