大家好,我是目標 c 的新手。以下代碼不是我的。我只是想了解它是如何作業的。我有一個 ViewController 在 .h 檔案中有這個屬性。
@property (nullable, nonatomic, copy) dispatch_block_t logHandler;
在 .m 檔案中,當使用以下代碼按下按鈕時,將呼叫 logHandler。
- (IBAction)login:(id)sender {
if (nil != self.logHandler) {
self.logHandler();
}
}
然后呼叫存在于另一個類 NSObject 檔案中的 logHandler
在 .h 檔案中
@interface LogFlow : NSObject<TheFlowController>
@end
并在 .m 檔案中
- (UIViewController *)rootViewController {
LogViewController *viewController = LogViewController.newInstance;
viewController.logHandler = ^{
UIViewController *logController = [self startNewLogFlow];
[self.navigationController pushViewController:logController animated:YES];
};
return viewController;
}
我不明白為什么 logHandler 存在于另一個類中以及為什么從這個特定類呼叫它,以及如何在不使用任何匯入的情況下從另一個類呼叫此代碼?我試圖了解何時使用這種實作以及如何使用它。任何幫助表示贊賞。
uj5u.com熱心網友回復:
您在 中看到的構造rootViewController:
^{
UIViewController *logController = [self startNewLogFlow];
[self.navigationController pushViewController:logController animated:YES];
};
這就是Objective-C中所謂的“塊”。您可能會在其他語言中找到對它的其他參考,稱為“匿名函式”或“閉包”。這些名稱也適用于此。
這將創建一個只是一個函式的物件,但該函式沒有名稱。您還可以將未命名的函式分配給變數并從變數中呼叫它 - 這就是這里發生的情況。匿名函式塊,被分配給物件的logHandler實體變數viewController。稍后一些其他代碼可以通過變數呼叫該函式,如您在login:示例中所見。
這是一個更簡單的塊,它只是簡單的 Objective-C:
int squareFunction(int x) {
return x * x;
}
void playWithSquares(void);
void playWithSquares(void) {
int nine = squareFunction(3);
int alsoNine = (^(int x){
return x * x;
})(3);
}
的宣告squareFunction創建了一個計算兩個整數平方的命名函式。
您還可以看到以下運算式:
^(int x){
return x * x;
};
這也創建了一個計算整數平方的函式,但它不會將該函式系結到名稱。由于它沒有名稱,我們通過將其包裝在括號中然后傳遞引數來立即呼叫該函式(<anonymous function expression>)(3)
我們可以將匿名函式存盤在一個變數中:
typedef int (^SquaresBlock)(int);
SquaresBlock myBlock = ^(int x){
return x * x;
};
然后稍后使用 squaresBlock(3)
塊在 Cocoa 對 Objective-C 的使用中非常重要,所以你應該更多地了解它們。
https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/Blocks/Articles/00_Introduction.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/333944.html
