[英]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之類的現代面向對象語言時,需要記住一些事情:
最好在調用之前定義所有方法。 匿名方法很少使用,但仍然可以通過塊來完成。
與javascript不同,大多數時候都需要對變量進行強類型化。
變量不包含方法(除了需要理解一些變量弱/字符串引用的塊外)
除非聲明變量和方法,否則它們不存在。 您不能做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.