我定义了一个 block ,它接受一个 NSString
并为该字符串返回一个 NSURL
:
id (^)(id obj)
我使用 typedef
使它成为一个带有名称的 block :
typedef id (^URLTransformer)(id);
而下面的方法是行不通的:
+ (URLTransformer)transformerToUrlWithString:(NSString *)urlStr
{
return Block_copy(^(id obj){
if ([obj isKindOfClass:NSString.class])
{
NSString *urlStr = obj;
return [NSURL URLWithString:[urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
}
return nil; // **THIS LINE FAILS**
});
}
错误:
Return type 'void *' must match previous return type 'id' when block literal has unspecified explicit return type
我的问题是: 1.如何正确实现方法 2. 没有typedef URLTransformer的方法如何实现?
谢谢
最佳答案
1.
您可以将其转换为 id
或将类型添加到 block 中。我问了similar question之前并引用自 answer
The correct way to remove that error is to provide a return type for the block literal:
id (^block)(void) = ^id{
return nil;
};
你的情况
+ (URLTransformer)transformerToUrlWithString:(NSString *)urlStr
{
return Block_copy(^id(id obj){ // id here
if ([obj isKindOfClass:NSString.class])
{
NSString *urlStr = obj;
return [NSURL URLWithString:[urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
}
return nil; // id here
});
}
或
+ (URLTransformer)transformerToUrlWithString:(NSString *)urlStr
{
return Block_copy(^(id obj){
if ([obj isKindOfClass:NSString.class])
{
NSString *urlStr = obj;
return [NSURL URLWithString:[urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
}
return (id)nil; // **THIS LINE FAILS**
});
}
2.
要返回不带 typedef 的 block ,您可以使用类似的语法来返回函数指针
+ (id (^)(id))transformerToUrlWithString:(NSString *)urlStr;
您可以从 here 查看更多示例.
PS:在ObjC代码中应该避免使用Block_copy
,使用[block copy]
。
PS2:你一定是在使用 ARC(否则会有这么多泄漏)并且你不需要显式复制 block (在 99% 的情况下,包括这个)。
PS3:你应该尽可能避免id
,所以你的 block 应该是typedef NSURL *(^URLTransformer)(NSString *);
关于ios - 返回没有 typedef 的 block 的 Objective-C 方法的语法/签名是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18370041/