Независимо от того, как вы объявляете свои переменные и параметры, ваш код не будет работать.Есть проблема, которая проходит через все ваши ошибки компилятора, и это будет проблемой, даже если вы не делали запутанные вещи с блоками.
Вы пытаетесь добавить символы в NSArray.Вы не можете сделать это.Вы должны будете обернуть их как некий объект Objective C.Поскольку для работы этого примера требуется только одно - чтобы объекты могли быть входными данными для компонентов JoinedByString, вы можете вернуть односимвольные строки NSStrings из g.Тогда для genArray будет работать некоторое количество сигнатур, таких как id ^ ().Я не уверен, как вы заключите это в скобки.Примерно так:
+ (id) genArray: (id^()) gen;
+ (id) genString {
...
NSString * (^g)() = ^() {
return [NSString stringWithFormat:@"%c", [ObjCheck genChar]];
};
...
}
NSString * - это идентификатор.Чар нет.Вы можете передать NSString * ^ () в id ^ (), но при попытке передать char ^ () в id ^ () вы получите ошибку компилятора.Если вы отказались от некоторой универсальности genArray и объявили, что он принимает char ^ (), он скомпилирует ваш вызов genArray, но при попытке вызвать arrayByAddingObject произойдет ошибка, и аргумент не будет введен в качестве идентификатора.
Кто-то, кто понимает тонкости блочного синтаксиса, может свободно редактировать мой пост, если я получу некоторые незначительные синтаксические ошибки.
Кстати, используйте NSMutableArray в качестве локальной переменной в genArray.Вызов arrayByAddingObject снова и снова будет иметь производительность O (n ^ 2) времени, я думаю.Вы все еще можете объявить тип возвращаемого значения как NSArray, который является суперклассом NSMutableArray, и вызывающие объекты genArray не будут знать разницу.