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

时间:2013-09-12 13:07:30

标签: javascript objective-c

我是一名学习Obj-C的JS开发人员。我有大部分的基础知识,但我已经挂了一些概念。看到以下功能的客观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)
})

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

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

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

在obj-c中这或多或少与block相同,所以你可以这样写:

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并在结果回调上应用任意函数,并且你每隔interval毫秒进行一次调用。

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

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

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

然后我们用该方法创建NSTimer(参见下面方法here的参考):

// 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:进行的修改..我从here借用了修改。基本上没有在选择器上运行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不是。)

答案 1 :(得分:1)

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

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

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

  2. 与javascript不同,变量需要大部分时间进行强类型化。

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

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

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