Нестандартное использование блоков в Objective-C

Доброго времени суток!

Встал вопрос возможно ли реализовать следующее поведение ф-ции с блоком в качестве параметра:

Объявление ф-ции:
NSString *AppendString(NSString *string, void (^block)(NSString *stringToAppend));

Реализация:
NSString *AppendString(NSString *string, void (^block)(NSString *stringToAppend)){
   // Хочется получить доступ к stringToAppend, возможно ли это впринципи?
    return [NSString stringWithFormat:@"%@<<-->>%@", string, stringToAppend];
}

Использование:
NSString *newString = AppendString(@"firstString", ^(NSString *stringToAppend){
    // Нужно изменить значение переменной блока и получить доступ к измененному значению внутри самого блока, те в реализации ф-ции
    stringToAppend = @"secondString";
});

Те в функцию передаем одну строчку нормальным способом, а вторую изменяем внутри блока, и внутри самой функции складываем строчки и возвращаем результат. Это возможно?

ЗЫ: Я знаю что это извращенство, отдаю себе отчет, что это возможно не реализовать, знаю как надо использовать блоки по назначению. Заранее спасибо!
  • Вопрос задан
  • 2501 просмотр
Пригласить эксперта
Ответы на вопрос 2
@Ne0nX
Если правильно понял, то как-то так.

Реализация:
NSString *AppendString(NSString *string, NSString * (^block)() ){
    return [NSString stringWithFormat:@"%@<<-->>%@", string, block()];
}


Использование:
NSString *newString = AppendString(@"firstString", ^NSString*(){
    return @"str";
});
Ответ написан
gooddy
@gooddy
да, странный конечно подход, больше подходит таки с возвращением значения из блока, но да ладно, каждый чудит так как хочет

typedef void(^StringPtrBlock)(NSString **str);
NSString *AppendString(NSString *string, StringPtrBlock block);


NSString *AppendString(NSString *string, StringPtrBlock block){
	// Хочется получить доступ к stringToAppend, возможно ли это впринципи?
	NSString *str;
	block(&str);
    return [NSString stringWithFormat:@"%@<<-->>%@", string, str];
}


NSLog(@"%@", AppendString(@"Lol", ^(NSString **stringToAppend) {
		if (stringToAppend) {
			*stringToAppend = @"WUT?";
		}
	}));


Вывод: Lol<<-->>WUT?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы