簡體   English   中英

Objective-C方法/函數調用。 (來自javascript示例)

[英]Objective-C method/function calling. (from javascript example)

我是學習Obj-C的JS開發人員。 我的大部分基礎知識都不完整,但是我迷上了一些概念。 看到以下功能的目標轉換對我來說非常有幫助。

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並在結果回調上應用一個無名函數,並且您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. 除非聲明變量和方法,否則它們不存在。 您不能做total =結果+其他,因為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遵循先前的答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM