Objective-C 方法/函数调用.(来自JavaScript示例)



我是一名学习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)
})

非常感谢您的任何帮助。

这不是

一个完整的翻译,因为有一些代码似乎丢失了(见我上面的评论)。 但这至少会给你一个起点:

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

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

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

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

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

在这里,您基本上是在调用doSomething并在结果回调上应用一个 anynomous 函数,并且您每 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];

更新:

所以现在我知道开始是什么,我们基本上是这样定义的(注意:这里我使用对原始 + scheduledTimerWithTimeInterval: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不是)。

首先,您提供的代码在某种程度上不完整。变量"result"永远不会在代码段范围内定义。

从脚本语言(如

javascript)传递到现代面向对象语言(如objective-c)时,有几件事需要记住:

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

  2. 与javascript不同,变量在大多数时候都需要强类型化。

  3. 变量
  4. 不持有方法(块除外,需要一点变量弱/字符串引用理解)

  5. 变量和方法不存在,除非你声明它们。你不能做总计=结果+其他,因为总数还不存在。你必须首先声明它做CGFloat总数=结果+其他。

与您提供的类似的代码在目标 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的先前答案。

相关内容

  • 没有找到相关文章

最新更新