【问题标题】:ObjC error throwing function returning () instead of BOOLObjC 错误抛出函数返回 () 而不是 BOOL
【发布时间】:2015-10-03 21:40:52
【问题描述】:

我有一个 Objective C 函数声明为:

+ (BOOL)isScanningUnsupported:(NSError **)error;

如果它返回 true,我必须在从 (Swift) 调用它的函数中返回 nil。

所以我会这样打电话:

 var isUnsupported = false

 do { try  isUnsupported = PPCoordinator.isScanningUnsupported()
 } catch let error { throw error }

 if isUnsupported {return nil }

但它告诉我:

无法将“()”类型的值分配给“Bool”类型的值

在Objective C中它被称为:

if ([PPCoordinator isScanningUnsupported:error]) {
    return nil;
}

我该怎么办????

【问题讨论】:

    标签: objective-c error-handling try-catch return-value swift2


    【解决方案1】:

    您正在描述在 Objective-C 中产生错误的函数在 Swift 中解释的标准方式。 Objective-C 中接受错误指针并返回 BOOL 的方法被假定为 void 并默认在 Swift 中抛出。

    这是因为这几乎总是在 Objective-C 中的含义。即 true 表示“成功运行”,false 表示“失败,我将错误放在您提供的指针中”。

    您的方法不符合正常的 Objective-C 约定,因此您可以尝试在 PPCoordinator.isScanningUnsupported 的声明中使用 NS_SWIFT_NOTHROW 宏来禁用 Swift 向抛出函数的转换。

    【讨论】:

    • 返回false 并不总是意味着失败。它也可以是一个有效值。例如。 checkResourceIsReachableAndReturnError 在 Swift 中返回 Bool。
    • @pointum 正如我所说:“几乎总是”。有趣的是,online documentation 中有一个错误。它声称 Swift 函数返回 Bool 但也有关于 Swift 中错误处理的标准段落(在这种情况下不正确)。
    【解决方案2】:

    我想你想要:

    var isUnsupported = false
    
     do { try  PPCoordinator.isScanningUnsupported()
        isUnsupported = true 
     } catch let error {
        throw error // or do nothing?
     }
    
     if isUnsupported {return nil }
    

    如果您查看函数的 Swift 定义,我预计没有返回值(即 void)。

    【讨论】:

      【解决方案3】:

      这对我有用:

          if let _ = try? PPCoordinator.isScanningUnsupported() { return nil }
      

      【讨论】:

        猜你喜欢
        • 2016-05-28
        • 1970-01-01
        • 2016-01-10
        • 2019-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多