Objective C - 调用的对象类型 'BOOL'(又名 'bool')不是函数或函数指针

Objective C - Called object type 'BOOL' (aka 'bool') is not a function or function pointer

正在处理遗留混合 iOS 项目。在 ConsentManager.swift 中创建了一个新的 Swift 实用程序 class,如下所示,

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 class、ConsentChecker.m 调用了方法,

@interface ConsentChecker ()
{
}
@end

@implementation ConsentChecker
-(void)checkConsent {
    
    // GETTING ERROR IN THE FOLLOWING LINE
    if (ConsentManager.sharedInstance.isDataPermissionConsentRequired())  { 
        …
    }
}
@end

获取编译器错误:

Called object type 'BOOL' (aka 'bool') is not a function or function pointer

为什么以及如何解决?

用于执行方法的 Obj-C 语法不同于 Swift 的点语法。

这是正确的语法:

if ([ConsentManager.sharedInstance isDataPermissionConsentRequired])  {

你遇到这个问题的原因是 Objective-C 中不带参数的方法可以使用点语法隐式调用 similar to Swift' s,但不完全一样。声明为

的方法
// 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 确定您正在尝试从方法中调用 returned 值,就好像它是一个功能:

instance.someMethod();

// equivalent to:

BOOL value = [instance someMethod];
value(); // <- Called object type 'BOOL' (aka 'bool') is not a function or function pointer

您不能像调用函数那样调用 BOOL,因此会出现错误。

@Dávid 提供了更传统的 Obj-C 语法来调用此方法,但您也可以简单地从调用中删除括号:

if (ConsentManager.sharedInstance.isDataPermissionConsentRequired) {

Objective-C-主义注:

点语法通常用于看起来像属性的方法调用(例如像您的 isDataPermissionConsentRequired 这样的布尔访问器),即使该方法可能需要对 return 做一些工作该值(想想:Swift 中的计算属性)。

对于执行一个动作,或者return一个值但可能需要大量工作的方法,通常首选传统的方法调用语法:

// Prefer:
[instance doTheThing];
NSInteger result = [instance performSomeExpensiveCalculation];

// over:
instance.doTheThing;
NSInteger result = instance.performSomeExpensiveCalculation;

如果你想在 obj-c 上调用 swift 函数 class 你使用 obj-c 语法

正确的语法是:

if ([ConsentManager.sharedInstance isDataPermissionConsentRequired])  {
    // Write logic here
}