【问题标题】:Objective-C method/function calling. (from javascript example)Objective-C 方法/函数调用。 (来自 javascript 示例)
【发布时间】:2013-09-12 13:07:30
【问题描述】:

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

非常感谢您的帮助。

【问题讨论】:

  • 您的问题非常广泛,包含许多部分。如果你一次只做一个部分,解释你正在尝试做什么以及你已经尝试过什么,你可能会更幸运地得到答案。
  • 感谢您的意见。我认为这确实解决了我遇到的特殊问题。看到一个人翻译工作会有很大帮助。
  • 这没有意义。你用三个参数定义了start,但是你只用一个参数来调用它?
  • @abbood 抱歉,只是编辑错误

标签: javascript objective-c


【解决方案1】:

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

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];

更新:

所以现在我知道 start 是什么,我们基本上将其定义为(注意:这里我使用对上面原始 + 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);
   }
}

然后finally而不是

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

你会:

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

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

【讨论】:

  • 谢谢!在start 变量范围的上下文中,我在哪里可以获得doSomething 的结果? (添加其他并记录)
  • 您最初的问题一开始就很长。如果我的回答令您满意,请将我的回答标记为正确。问题有一个移动的目标是不好的(见@ 987654327@).
  • 我也不确定你的意思..也许如果你给我看一个你在 javascript 中所说的例子..我可以告诉你它是 obj-c 等价物
【解决方案2】:

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

从脚本语言(如 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 的先前答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-23
    • 2014-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    • 2010-11-06
    相关资源
    最近更新 更多