【问题标题】:Objective C - Called object type 'BOOL' (aka 'bool') is not a function or function pointerObjective C - 称为对象类型'BOOL'(又名'bool')不是函数或函数指针
【发布时间】:2022-01-04 14:32:46
【问题描述】:

正在处理一个遗留的混合 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')不是函数或函数指针

为什么以及如何解决?

【问题讨论】:

    标签: ios swift objective-c compiler-errors boolean


    【解决方案1】:

    您遇到此问题的原因是,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 会确定您正在尝试从方法中调用 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-ism 注释:

    点语法最习惯性地用于看起来像属性的方法调用(例如,像 isDataPermissionConsentRequired 这样的布尔访问器),即使该方法可能需要做一些工作才能返回该值(想想:计算属性在斯威夫特)。

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

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

    【讨论】:

      【解决方案2】:

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

      这是正确的语法:

      if ([ConsentManager.sharedInstance isDataPermissionConsentRequired])  {
      

      【讨论】:

        【解决方案3】:

        如果你想在 obj-c 类上调用 swift 函数,你可以使用 obj-c 语法

        正确的语法是:

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

        【讨论】:

          猜你喜欢
          • 2012-06-22
          • 1970-01-01
          • 1970-01-01
          • 2014-04-17
          • 2018-02-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-21
          相关资源
          最近更新 更多