- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
只是想了解方 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/
我想“创建”一个类型“my_type”,它是一个 std_logic_vector(...),就像这个 C/VHDL 假代码: typedef std_logic_vector(CONSTANT do
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
我已阅读说明,我明白它是一个函数类型别名。 typedef 或函数类型别名为函数类型提供一个名称,您可以在声明字段和返回类型时使用该名称。当将函数类型分配给变量时,typedef 会保留类型信息。 h
Vala 是否有能力做一些类似于 C 中的 typedef 或 D 中的 alias 的事情?我检查了它的零星文档,但找不到与此相关的任何内容。 最佳答案 不是 typedef 本身,但您可以扩展大多
我对这段代码有一些问题: typedef struct Product { char product_code[5]; int sells; int sells_quantit
我对书中的代码有疑问: const int SQUARE_ARRAY_SIZE = 4; const int SQUARE_INFO_SIZE = 4; typedef Square SquareAr
typedef经常像这样工作:typedef .但是函数指针的 typedef 似乎有不同的结构:typedef int (*fn)(char *, char *); - 没有类型别名,只有一个函
我被分配去处理一些代码,但我事先得到了一部分。它包括这部分代码: typedef int ElementType; struct Node; typedef struct Node *PtrToNod
我正在尝试创建通用容器包装器。 template class ContainerWrapper { public: using allocator_type = typename type::al
抱歉,标题太长了。 我在类列表中有一个 typedef: template class List { // Think of a class Iter_ with ListElem *pCu
我想制作一个 typedef,它依赖于模板参数中 typedef 的存在: struct foo { using MyType = int; }; template struct bar {
出于教育目的,我正在查看 Eigen 源代码。我注意到对于每个具体类模板 X在层次结构中,有一个 internal::traits定义。一个典型的例子可以在 Matrix.h 中找到: namespa
假设我有三个文件 //first.h typedef typename std::map MapVertexVd_t; //the graph class and ... //other useful
如果我需要 Swift 中的自定义类型,我可以 typedef,我该怎么做? (类似于闭包语法 typedef) 最佳答案 关键字typealias用于代替typedef: typealias Cus
由于标题可能看起来很困惑,让我举个例子: typedef bool foo[2]; typedef foo bar[4]; bar what_am_i; 所以,我认为 what_am_i 是 [4][
我想声明一个 typedef,像这样: 指向另一个 typedef 的任何数组的指针。 例如: 类型定义 1: typedef struct { int a; }structA_t1; 类型定
要将 my_int 声明为 int 的类型别名,我们可以这样写: typedef int my_int; // (1) 奇怪的是,以下内容似乎也定义了 int 别名: int typedef my
如何在其他 typedef struct 中声明 typedef struct? typedef struct { char* type; char* destination;
我正在尝试将 malloc'd ptr 保存在全局 ptr 中,以便我可以在另一个函数中使用它。理想情况下,我希望在全局范围内有一个更智能的数据结构,但现在我只是想让全局 ptr 工作。 在我的 lw
MachineState machine; ControlSignals theControls = machine.control_signals; //Why is this giving an
我是一名优秀的程序员,十分优秀!