টাইপএফ না ব্যবহার করে একটি ব্লক পদ্ধতির পরামিতি ঘোষণা করুন


146

কোনও টাইপডেফ ব্যবহার না করেই অবজেক্টিভ-সি-তে কোনও মেথড ব্লক প্যারামিটার নির্দিষ্ট করা সম্ভব? এটি অবশ্যই ফাংশন পয়েন্টারের মতো হতে পারে তবে আমি একটি মধ্যবর্তী টাইপিডেফ ব্যবহার না করে বিজয়ী বাক্য গঠনকে আঘাত করতে পারি না:

typedef BOOL (^PredicateBlock_t)(int);
- (void) myMethodTakingPredicate:(PredicateBlock_t)predicate

কেবল উপরের সংকলনগুলি, এই সমস্ত ব্যর্থ:

-  (void) myMethodTakingPredicate:( BOOL(^block)(int) ) predicate
-  (void) myMethodTakingPredicate:BOOL (^predicate)(int)

এবং আমি স্মরণ করতে পারি না আমি অন্যান্য সংমিশ্রণগুলি কী চেষ্টা করেছি।


উত্তর:


238
- ( void )myMethodTakingPredicate: ( BOOL ( ^ )( int ) )predicate

9
+1, যদিও typedefআরও জটিল ক্ষেত্রে খুব বেশি পছন্দ করা উচিত।
ফ্রেড ফু

3
- ( void )myMethodTakingPredicate: ( BOOL ( ^ )( NSString *name, NSString *age ) )predicate { //How Should I Access name & age here...? }
মোহাম্মদ আব্দুররাফায়ে

6
এগুলি কেবল পরামিতিগুলির নাম। শুধু তাদের ব্যবহার করুন।
ম্যাকমেড

1
@ এলারসম্যানরা আমি সম্মত, যদি না এই নির্দিষ্ট প্রিডিকেট / ব্লকটি এমন অনেক জায়গায় ব্যবহার করা হয় যেখানে এটি টাইপডেফের চেয়ে বেশি স্পষ্ট হবে। অ্যাপল বেশ কয়েকটি ব্লককে সংজ্ঞায়িত করেছে যা বেশ সহজ ছিল, তবে এমনটি করেছে যাতে তারা ডকুমেন্টেশনে কী চায় তা সহজেই পাওয়া যায়।
এমটিমুরডক

2
দৃ recommend় সুপারিশ! আপনার ভেরিয়েবলের নাম দিন। তারা ব্যবহারযোগ্য কোডে স্বয়ংক্রিয়ভাবে পূর্ণ হবে। সুতরাং BOOL ( ^ )( int )সঙ্গে প্রতিস্থাপন BOOL ( ^ )( int count )
ফেনারল

65

উদাহরণস্বরূপ, এটি এটি চলে ...

[self smartBlocks:@"Pen" youSmart:^(NSString *response) {
        NSLog(@"Response:%@", response);
    }];


- (void)smartBlocks:(NSString *)yo youSmart:(void (^) (NSString *response))handler {
    if ([yo compare:@"Pen"] == NSOrderedSame) {
        handler(@"Ink");
    }
    if ([yo compare:@"Pencil"] == NSOrderedSame) {
        handler(@"led");
    }
}

আপনি [এনএসএস স্ট্রিং ইক্যুয়ালটোস্ট্রিং:] পদ্ধতিটি ব্যবহার না করার কোনও কারণ আছে কি?
অরকোডেন

2
বিশেষ কিছু না. আমি কেবল 'তুলনা:' ব্যবহার করতে ব্যবহার করছি। '[এনএসএসআর্টিং একুয়াল টুস্ট্রিং:]' তবে এটি আরও ভাল উপায়।
মোহাম্মদ আবদুররাফায়

আপনি শব্দ প্রয়োজন responseমধ্যে smartBlocksপদ্ধতি সংজ্ঞা? তুমি (NSString*))handler {কি বলতে পার না ?
অ্যাশ

আপনি থাকতে পারে (NSString *)) handler। এটি বৈধ।
মোহাম্মদ আব্দুররাফায়


9

আরেকটি উদাহরণ (এই ইস্যুটি একাধিক থেকে উপকৃত হয়):

@implementation CallbackAsyncClass {
void (^_loginCallback) (NSDictionary *response);
}
// …


- (void)loginWithCallback:(void (^) (NSDictionary *response))handler {
    // Do something async / call URL
    _loginCallback = Block_copy(handler);
    // response will come to the following method (how is left to the reader) …
}

- (void)parseLoginResponse {
    // Receive and parse response, then make callback

   _loginCallback(response);
   Block_release(_loginCallback);
   _loginCallback = nil;
}


// this is how we make the call:
[instanceOfCallbackAsyncClass loginWithCallback:^(NSDictionary *response) {
   // respond to result
}];

2

আরও স্পষ্ট!

[self sumOfX:5 withY:6 willGiveYou:^(NSInteger sum) {
    NSLog(@"Sum would be %d", sum);
}];

- (void) sumOfX:(NSInteger)x withY:(NSInteger)y willGiveYou:(void (^) (NSInteger sum)) handler {
    handler((x + y));
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.