gpt4 book ai didi

Objective-C:typedef 一个 block ,在方法声明中使用它。我该如何实现?

转载 作者:太空狗 更新时间:2023-10-30 03:28:18 25 4
gpt4 key购买 nike

只是想了解方 block 。我明白了。它们就像函数指针,但它们实际上是对象;您可以声明一个 block 变量并为其分配一个 block 值;像函数一样调用它;由于缺少术语,当它们被执行时,它们会“及时卡住”,等等。我已经创建了几个 block 并以几种不同的格式成功运行了它们,但是当涉及到在方法中使用它们时- - 无论是否使用 typedef - 我遇到了很多麻烦。例如,这是我创建的一个对象接口(interface),只是为了掌握语法。我几乎不知道如何实现它。

// AnObject.h

#import <Foundation/Foundation.h>

// The idea with the block and the method below is for the block to take
// an int, multiply it by 3, and return a "tripled" int. The method
// will then repeat: this process however many times the user wants via
// the howManyTimes parameter and return that value in the form of an int.

typedef int (^triple)(int);

@interface AnObject : NSObject
{
int num;
}

-(int)repeat:(int)howManyTimes withBlock:(triple)someBlock;

@end

到目前为止,这是我的实现:

#import "AnObject.h"

@implementation AnObject

@synthesize num;

-(int)repeat:(int)howManyTimes withBlock:(triple)someBlock {
for (int i = 0; i <= howManyTimes; i++) {
// What the heck am I supposed to put here? I'm baffled by the
// syntax over and over again.
}
}

@end

我知道我还没有处理实例变量。同样,这是一个草稿,只是试图了解 block 的工作原理。我什至宣布这种方法是正确的吗?我正在阅读 Big Nerd Ranch 的 Objective-C Programming、Mike Clark 关于 Pragmatic Studio 的 block 的文章以及几个 SO 线程。找不到任何相关的东西。谢谢。

编辑:XCode 4.3.2,如果重要的话。

进一步编辑:好的。使用 BJ 的(稍微修改过的)示例,我想我想出了一个非常复杂的 5 乘以 3 的方法。:)

// BJ's implementation:

-(int)repeat:(int)howManyTimes withBlock:(Triple)someBlock {

int blockReturnValue;

for (int i = 0; i <= howManyTimes; i++) {
blockReturnValue = someBlock(i);
}
return blockReturnValue;
}

主要内容:

...
@autoreleasepool
{
AnObject *obj = [[AnObject alloc] init];

NSLog(@"%d", [obj repeat: 5 withBlock: ^ (int number) {
return number * 3;
}]);

}
return 0;
...

输出是:

15

现在,它倒退了 15,因为我定义为参数的 block 只运行了一次,对吗?它将“数字”(在本例中为 5)乘以 3 并卡住该答案,对吗?我确定我只是创建了一个完全无用的方法,而且我还不了解如何利用 block 的好处/功能。我说得对吗?

/************ ********* 更新 *********************/

更新:我明白你在说什么,CRD。只是一个更正,对于任何可能正在阅读本文的新程序员来说,得到不同的输出并去,“Que?”您的 for 循环应该是:

for (int i = 0; i < howManyTimes; i++)
value = someBlock(value);

……或者……

(i = 1; i <= howManyTimes; i++)

...得到答案 243。

而且,是的,这正是我最初尝试使用此代码执行的操作。至少那是我认为应该发生的事情。事实证明,作者的意图不是将数字增加三倍,存储该值,将存储值增加三倍,存储...等等,而只是为数字 1-5 打印 x * 3 (3, 6, 9, 12、15)。

这是成品。我只是键入定义了一个 block ,它接受一个 int 并返回一个 int,称为 Tripler。我还将参数的名称从“someBlock”更改为“triple”,以更清楚地表明 block 的预期用途。我认为这些是对代码的唯一更改。

/********************  interface  ********************/


#import <Foundation/Foundation.h>

typedef int (^Tripler)(int);

@interface AnObject : NSObject

-(void)iterateFromOneTo:(int)number withBlock:(Tripler)triple;

@end

/******************** implementation ********************/


#import "AnObject.h"

@implementation AnObject

-(void)iterateFromOneTo:(int)number withBlock:(Tripler)triple {
for (int i = 1; i <= number; i++) {
NSLog(@"%d", triple(i));
}
}

@end

/******************** main.m ********************/


#import "AnObject.h"
#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{
@autoreleasepool
{
AnObject *obj = [[AnObject alloc] init];

[obj iterateFromOneTo:5 withBlock:^(int number) {
return number * 3;
}];
}
return 0;
}

正如您可能想象的那样,结果输出是:

2012-05-05 17:10:13.418 Untitled 2[71735:707] 3
2012-05-05 17:10:13.445 Untitled 2[71735:707] 6
2012-05-05 17:10:13.446 Untitled 2[71735:707] 9
2012-05-05 17:10:13.446 Untitled 2[71735:707] 12
2012-05-05 17:10:13.447 Untitled 2[71735:707] 15

我让它变得比需要的复杂得多。很抱歉在 OP 中解释得如此糟糕。谢谢你的帮助!/线? :)

最佳答案

通过阅读你的问题,我明白了,或者可能被误解了,你的意图是产生应用你的 block 的结果 n 次;例如如果您两次应用三倍函数,您将得到原始值乘以九。

为了以防万一,这里是执行此操作的代码:

@interface AnObject

typedef int (^monadic)(int); // an function which takes an int and return an int

- (int) repeat:(int)howManyTimes for:(int)value withBlock:(monadic)someBlock;

@end

@implementation AnObject

- (int) repeat:(int)howManyTimes for:(int)value withBlock:(monadic)someBlock
{
for (int i = 0; i < howManyTimes; i++)
value = someBlock(value);

return value;
}

@end

现在调用它:

AnObject *myObject = [AnObject new];

int z = [myObject repeat:5
for:1
withBlock: ^(int number)
{
return number * 3;
}
];

z 的值为243

关于Objective-C:typedef 一个 block ,在方法声明中使用它。我该如何实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10439696/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com