我是一名学习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)时,有几件事需要记住:
所有方法最好在调用之前定义。匿名方法很少使用,但仍然可以通过块来完成。
与javascript不同,变量在大多数时候都需要强类型化。
变量不持有方法(块除外,需要一点变量弱/字符串引用理解)
变量和方法不存在,除非你声明它们。你不能做总计=结果+其他,因为总数还不存在。你必须首先声明它做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的先前答案。