Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 返回不带typedef的块的Objective-C方法的语法/签名是什么?_Ios_Objective C_Block_Objective C Blocks - Fatal编程技术网

Ios 返回不带typedef的块的Objective-C方法的语法/签名是什么?

Ios 返回不带typedef的块的Objective-C方法的语法/签名是什么?,ios,objective-c,block,objective-c-blocks,Ios,Objective C,Block,Objective C Blocks,我定义了一个块,它接受一个NSString,并为该字符串返回一个NSURL: id (^)(id obj) 我使用了typedef将其设置为一个带有名称的块: typedef id (^URLTransformer)(id); 以下方法不起作用: + (URLTransformer)transformerToUrlWithString:(NSString *)urlStr { return Block_copy(^(id obj){ if ([obj isKindOf

我定义了一个块,它接受一个
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的情况下实现该方法

谢谢

您可以将其强制转换为
id
或将类型添加到块中。我之前问过,并引用了

删除该错误的正确方法是为 块文字:

就你而言

+ (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
    });
}

二,

要返回不带typedef的块,可以使用类似的语法返回函数指针

+ (id (^)(id))transformerToUrlWithString:(NSString *)urlStr;
您可以从中查看更多示例

注:在ObjC代码中,您应该避免使用
块复制
,使用
[Block copy]

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


PS3:您应该尽可能避免使用
id
,因此您的块应该是
typedef NSURL*(^urltransfer)(NSString*)

您可以避免这样的
typedef

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

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

你的块的类型是
id(^)(id)
-这是加号后面的括号。

嗨,它说'Cast of block pointer type'id(^)(u strong id)'到C pointer type'const void*'需要桥接转换,如果我不使用block\u copy,它可以与[…copy]一起工作。@hzxu你的Xcode/Clang版本是什么?您还可以强制转换
nil
。e、 g.
return(id)nil您的代码如何处理方法的
urlStr
参数?
+ (id (^)(id))transformerToUrlWithString:(NSString *)urlStr;
@interface Blah : NSObject
+(id (^)(id)) blockret;
@end

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