3

我定义了一个块,它接受一个并为该字符串NSString返回一个:NSURL

id (^)(id obj)

我曾经typedef把它做成一个有名字的块:

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**
    });
}

错误:

当块文字具有未指定的显式返回类型时,返回类型“void *”必须匹配先前的返回类型“id”

我的问题是:1.如何正确实现方法2.如何实现没有typedef URLTransformer的方法?

谢谢

4

2 回答 2

3

1.

您可以将其转换为id或添加类型以阻止。我之前问过类似的问题并引用答案

消除该错误的正确方法是为块文字提供返回类型:

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 的块,您可以使用类似的语法来返回函数指针

+ (id (^)(id))transformerToUrlWithString:(NSString *)urlStr;

您可以从此处查看更多示例。

PS:您应该避免Block_copy在 ObjC 代码中使用[block copy].

PS2:您必须使用 ARC(否则会有很多泄漏)并且您不需要显式复制块(在 99% 的情况下,其中包括这个)。

PS3:你应该尽可能避免id,所以你的块应该是typedef NSURL *(^URLTransformer)(NSString *);

于 2013-08-22T01:08:17.777 回答
2

你可以避免typedef这样:

@interface Blah : NSObject
+(id (^)(id)) blockret;
@end

@implementation Blah
+(id (^)(id)) blockret {
    return ^(id obj) {
        return @"helo";
    };
}
@end

您的块的类型是id (^)(id)- 这就是加号后括号中的内容。

于 2013-08-22T01:08:36.577 回答