0

我是一名学习 Obj-C 的 JS 开发人员。我已经掌握了大部分基础知识,但我对一些概念感到困惑。看到以下函数的 Objective-C 翻译对我来说非常有帮助。

var doSomething = function (callback) {
 //some work
}

var start = function (interval, other, cb) {

  setInterval(doSomething(function(result){
    total = result + other
    cb(total)
  }), interval)

}

start(1000, 10, function(total){
  console.log(total)
})

非常感谢您的帮助。

4

2 回答 2

2

这不是完整的翻译,因为您的某些代码似乎丢失了(请参阅我上面的评论)..但这至少会给您一个起点:

var doSomething = function (callback) {
 //some work
}

在 obj-c 中,这或多或少与相同,因此您可以编写如下内容:

void (^doSomething)(id) = ^(callback) {
    // some work
}

我不会解释语法,这就是上面链接的用途。由于 javascript 是松散类型的,并且您没有指定回调的数据类型是什么.. 我将回调参数设置为idobj-c 中的泛型,它可以代表任何类(包括块)

var start = function (interval, other, cb) {

  setInterval(doSomething(function(result){
    total = result + other
    cb(total)
  }), interval)

}

在这里,您基本上doSomething是在结果回调上调用和应用一个任意函数,并且您每interval毫秒进行一次调用。

在 Objective-c 中,您使用NSTimer来执行setInterval所做的事情。

NStimer 调用一个选择器(即方法).. 所以我们只需创建一个环绕我们的块的方法:

-(void)blockWrapper:(id)argument {
   doSomething(argument);
}

然后我们使用该方法创建 NSTimer(请参阅下面的方法参考

// here interval is in seconds, in your code it is in milliseconds
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:interval 
                                                  target:self 
                                                selector:@SEL(blockWrapper:) 
                                                userInfo:nil 
                                                 repeats:YES];

更新:

所以现在我知道 start 是什么,我们基本上这样定义它(注意:这里我使用对原始+ scheduleTimerWithTimeInterval:target:selector:userInfo:repeats:上面的修改..我从这里借用修改..基本上修改不是让 NSInterval 在选择器上运行,而是使其在块上运行。请注意,修改代码假定块没有参数。我会更改该代码并使其期望类型为void(^blockName)((void)(^otherBlockname)(void))..

- (void)start:(int)interval other:(int)other callback:(void)((^)(int total))callback {

    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:interval 
                                                     repeats:YES 
                                                     actions:doSomething(^(result) {
       int total = result + other; 
        callback(total);
   }
}

然后最后而不是

start(1000, 10, function(total){
  console.log(total)
})

你会有:

[start:1000 other:10 callback:^(total) {
    NSLog(@"%d",total);
}];

最后说明:上面的代码非常先进。我强烈建议您将每个部分都单独练习(即查看我上面引用的块文章.. 花点时间阅读它.. 块语法需要一段时间才能理解.. 它并不那么简单作为 javascript b/c 中的匿名函数,你必须对参数非常具体。同样,javascript 是一种松散类型的语言,obj-c 不是)。

于 2013-09-12T14:15:33.790 回答
1

首先,您提供的代码不完整。变量“结果”从未在您的代码段范围内定义。

从像 javascript 这样的脚本语言到像 Objective-c 这样的现代面向对象语言时,需要记住一些事情:

  1. 最好在调用之前定义所有方法。匿名方法很少使用,但仍然可以通过块来完成。

  2. 与 javascript 不同,变量在大多数情况下都需要强类型。

  3. 变量不包含方法(除了需要一些变量弱/字符串引用理解的块)

  4. 变量和方法不存在,除非您声明它们。你不能做总=结果+其他,因为总还不存在。你必须先声明它 CGFloat total = result + other。

与您提供的类似代码在目标 C 中可能如下所示:

    - (CGFloat)cb:(CGFloat)input
    {
        return input * <Whatever calculation you perform>;
    }

    - (CGFloat)preDoSomething:(CGFloat)result
    {
        //Some work
        CGFloat total = result + other;
        total = [self cg:total];
        return total;
    }

    - (CGFloat)doSomethingWithResult:(CGFloat)result andInterval:(NSRange)interval
    {
        //Some work
        return result;
    }

    - (void)startWithInterval:(NSRange)interval other:(CGFloat)other cb:(CGFloat)cb
    {
        [self setInterval:[self doSomethingWithResult:[self preDoSomething:result] andInterval:interval]];
    }

更新

我看到您现在尝试使用 setInterval 调用做什么。在这种情况下,坚持使用 NSTimer 的先前答案。

于 2013-09-12T14:44:35.613 回答