我是一名学习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)
})
非常感谢您的帮助。
答案 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这样的现代面向对象语言时,需要记住一些事项:
所有方法都优先在事先调用之前定义。匿名方法很少使用,但仍可以通过块来完成。
与javascript不同,变量需要大部分时间进行强类型化。
变量不包含方法(除了需要一些变量弱/字符串引用理解的块之外)
除非您声明变量和方法,否则它们不存在。你不能做total = result + other因为total还不存在。你必须首先声明它做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坚持先前的答案。