致力于遺留混合 iOS 專案。在 ConsentManager.swift 中創建了一個新的 Swift util 類,如下所示,
import Foundation
public class ConsentManager: NSObject {
@objc static let sharedInstance = ConsentManager()
@objc private override init() {}
@objc public func isDataPermissionConsentRequired() -> Bool
{
…
return value; // based on logic
}
}
從另一個 objc 類中呼叫該方法, ConsentChecker.m 之類的,
@interface ConsentChecker ()
{
}
@end
@implementation ConsentChecker
-(void)checkConsent {
// GETTING ERROR IN THE FOLLOWING LINE
if (ConsentManager.sharedInstance.isDataPermissionConsentRequired()) {
…
}
}
@end
獲取編譯器錯誤:
被呼叫的物件型別“BOOL”(又名“bool”)不是函式或函式指標
為什么以及如何解決?
uj5u.com熱心網友回復:
你這樣做的原因是,Objective-C 中不帶引數的方法可以使用類似于Swift 的點語法隱式呼叫,但不完全像它。一個方法宣告如下
// Inside of SomeClass
- (BOOL)someMethod { /* return something */ }
可以稱為
SomeClass *instance = ...
// Traditional Obj-C syntax:
BOOL value = [instance someMethod];
或者
// Dot syntax accessor:
BOOL value = instance.someMethod;
需要注意的是點語法版本并不會使用括號來表示該呼叫。當您像在 Swift 中一樣添加括號時,Obj-C 確定您正在嘗試呼叫方法的回傳值,就好像它是一個函式:
instance.someMethod();
// equivalent to:
BOOL value = [instance someMethod];
value(); // <- Called object type 'BOOL' (aka 'bool') is not a function or function pointer
您不能像呼叫BOOL函式那樣呼叫 a ,因此會出現錯誤。
@Dávid 提供了更傳統的 Obj-C 語法來呼叫此方法,但您也可以簡單地從呼叫中洗掉括號:
if (ConsentManager.sharedInstance.isDataPermissionConsentRequired) {
Objective-C-ism 注意:
點語法最慣用地用于看起來像屬性的方法呼叫(例如像您的 布爾訪問器isDataPermissionConsentRequired),即使該方法可能需要做一些作業才能回傳該值(想想:Swift 中的計算屬性)。
對于執行操作或回傳值但可能需要大量作業的方法,通常首選傳統的方法呼叫語法:
// Prefer:
[instance doTheThing];
NSInteger result = [instance performSomeExpensiveCalculation];
// over:
instance.doTheThing;
NSInteger result = instance.performSomeExpensiveCalculation;
uj5u.com熱心網友回復:
用于執行方法的 Obj-C 語法與 Swift 的點語法不同。
這是正確的語法:
if ([ConsentManager.sharedInstance isDataPermissionConsentRequired]) {
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/403870.html
標籤:
