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
}
正在处理遗留混合 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
}