ios - 返回没有 typedef 的 block 的 Objective-C 方法的语法/签名是什么?

标签 ios objective-c block objective-c-blocks

我定义了一个 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/

相关文章:

ios - 在 iOS 上运行 QML 或 Qt

iOS - 在选项卡更改时运行代码

ios - 是否可以有一个不覆盖整个屏幕的 ScrollView ?

objective-c - 我如何使用cocoa中的webview对象来显示网页?

c++ - 你能在 Cocoa (Obj-C) 项目中使用 C++ 库吗?

ios - 当我在 NSOperation 执行 performSelectorOnMainThread 时弹出导航 Controller 时应用程序崩溃

ruby - 在 Ruby 中,#each_pair 在遍历哈希时比 #each 有什么优势?

iphone - 关于在 iOS 和 Android 上开发多人游戏的建议?

ios - UIView的animateWithDuration延迟不延迟动画

c# - 限制 block 只能在从 EpiServer 中的某个接口(interface)继承的 ContentArea 中使用