我有这个代码,它是(非常长的)方法签名的一部分:
[...]requestCreator:(NSURLSessionDataTask *(^)(void (^)(NSURLSessionDataTask *, NSError *)))creator {
//
};
我不太明白,参数中没有变量名称,而且之前似乎是一个类型转换。
有人可以打破这种语法并解释这里的行为是什么吗?
答案 0 :(得分:4)
采用原始方法参数声明:
(NSURLSessionDataTask *(^)(void (^)(NSURLSessionDataTask *, NSError *)))creator
这种声明的形式是(type)identifier
。因此,标识符为creator
,类型为:
NSURLSessionDataTask *(^)(void (^)(NSURLSessionDataTask *, NSError *))
在局部变量声明中,看起来这可能是更熟悉的格式,而不是:
NSURLSessionDataTask *(^creator)(void (^)(NSURLSessionDataTask *, NSError *))
让我们用一些typedef重做:
typedef void (^TaskErrorHandlerBlock)(NSURLSessionDataTask *, NSError *);
typedef NSURLSessionDataTask* (^TaskCreatorBlock)(TaskErrorHandlerBlock);
TaskCreatorBlock creator;
我已经根据我的猜测编造了名称TaskErrorHandlerBlock
和TaskCreatorBlock
。 TaskCreatorBlock
是一个返回NSURLSessionDataTask*
的块 - 它创建了这样一个任务对象。它需要TaskErrorHandlerBlock
作为输入,这可能是一个块,如果出现错误则调用该块。它将遇到错误的任务和错误本身作为参数。
答案 1 :(得分:2)
它看起来像一个块,它接受另一个获取url会话和错误的块。