奇怪的Objective-C块中的访问值

奇怪的Objective-C块中的访问值,objective-c,objective-c-blocks,Objective C,Objective C Blocks,我有一个非常奇怪的测试任务。在头文件中有一个函数: NSString *AppendString(NSString *string, void (^block)(NSString *stringToAppend)); 它应该使用块将一个字符串附加到另一个字符串。在我看来,我应该这样做: NSString *newString = AppendString(@"firstString", ^(NSString *stringToAppend){ stringToAppend = @"se

我有一个非常奇怪的测试任务。在头文件中有一个函数:

NSString *AppendString(NSString *string, void (^block)(NSString *stringToAppend));
它应该使用块将一个字符串附加到另一个字符串。在我看来,我应该这样做:

NSString *newString = AppendString(@"firstString", ^(NSString *stringToAppend){
    stringToAppend = @"secondString";
});
如何实现这一功能?我不知道如何处理C风格函数中的块。禁止以Objective-C样式重写基函数。谢谢你的帮助,对不起我的英语

编辑:

声明:

NSString *AppendString(NSString *string, void (^block)(NSString *stringToAppend));
实施(不确定):

使用:

NSString *newString = AppendString(@"firstString", ^(NSString *stringToAppend){
    // no logic here, just block parameter assignment
    // is it possible to assign stringToAppend here and access to it's variable inside using?
    stringToAppend = @"secondString";
});

如何编写正确的实现?

此函数在块内传递NSString,因此您需要保存该字符串而不是分配给它:

// Declare new block variable (you can assign data to it inside block) to save string
__block NSString *newString = @"";

AppendString(@"firstString", ^(NSString *stringToAppend){
    // Save variable returned by block in variable defined above
    newString = stringToAppend;
});
// Log result to the console
NSLog(@"Result: %@", newString);
//编辑

//1. Declaration
// (^block) - this define name of your block, in this case the name is - block
// You don't have to use NSString the data is returned by block, not function
void AppendString(NSString *string, void (^block)(NSString *stringToAppend));

//1. Implementation function doesn't return the data, the data is returned by block:
void AppendString(NSString *string, void (^block)(NSString *stringToAppend)){
    block(string);
}

//1.Using:
__block NSString *result = @"";

    AppendString(@"test", ^(NSString *stringToAppend) {
        result = stringToAppend;
    });
    NSLog(@"Result: %@", result);


//2. Declaration
// You return the data by function and by block
NSString* AppendString(NSString *string, void (^block)(NSString *stringToAppend));

//2. Implementation function returns the data, and block too:
NSString* AppendString(NSString *string, void (^block)(NSString *stringToAppend)){
    block(string);
    return [NSString stringWithFormat:@"%@ - returned by function", string];
}
//2.Using:
__block NSString *result = @"";

    NSString *funcResult =  AppendString(@"test", ^(NSString *stringToAppend) {
        result = stringToAppend;
    });
    NSLog(@"Block result: %@", result);
    NSLog(@"Function result: %@", funcResult);
有两个示例可以创建和使用您想要的函数。
请同时查看这两个选项,这些注释应该可以解释它们的工作原理。

您实际想要实现的目标是什么?这是家庭作业吗?如果是家庭作业,那么清楚准确地写下你想做什么将是一个很好的练习。例如,如果您有一个C函数的规范,那么最好知道这一点。你必须学会写下你真正想要实现的东西,否则写下你想要的代码是不可能的。请看我的编辑。有可能在使用中传递“stringToAppend”并在实现中访问它吗?请看编辑后的问题。对不起,我不太明白你们想做什么。您可以将字符串指定给块内的stringToAppend,如示例stringToAppend=@“secondString”;但你以后不用它。它是本地分配还是我可以在实现内部使用?我需要access stringToAppend来进行连接。您应该阅读一些有关该块的信息。如果你在谈论这个函数的实现,你就不会涉及块变量(我在谈论你的例子)。您应该对*string变量进行字符串连接,并将其传递给块:void AppendString(NSString*string,void(^block)(NSString*stringToAppend)){string=@“secondString”;block(string);}
//1. Declaration
// (^block) - this define name of your block, in this case the name is - block
// You don't have to use NSString the data is returned by block, not function
void AppendString(NSString *string, void (^block)(NSString *stringToAppend));

//1. Implementation function doesn't return the data, the data is returned by block:
void AppendString(NSString *string, void (^block)(NSString *stringToAppend)){
    block(string);
}

//1.Using:
__block NSString *result = @"";

    AppendString(@"test", ^(NSString *stringToAppend) {
        result = stringToAppend;
    });
    NSLog(@"Result: %@", result);


//2. Declaration
// You return the data by function and by block
NSString* AppendString(NSString *string, void (^block)(NSString *stringToAppend));

//2. Implementation function returns the data, and block too:
NSString* AppendString(NSString *string, void (^block)(NSString *stringToAppend)){
    block(string);
    return [NSString stringWithFormat:@"%@ - returned by function", string];
}
//2.Using:
__block NSString *result = @"";

    NSString *funcResult =  AppendString(@"test", ^(NSString *stringToAppend) {
        result = stringToAppend;
    });
    NSLog(@"Block result: %@", result);
    NSLog(@"Function result: %@", funcResult);