【问题标题】:NS_REFINED_FOR_SWIFT and return valueNS_REFINED_FOR_SWIFT 和返回值
【发布时间】:2017-08-08 10:31:57
【问题描述】:

我是 Swift 新手,我开始探索一些与 Objective-C 桥接的功能。

目前我有一个带有NSError 参考的方法:

- (BOOL) verifyPersonalizationWithError:(NSError **) error NS_REFINED_FOR_SWIFT;

现在我可以访问 Swift 中的方法进行一些改进,但返回值丢失了。 Swift 的生成方法是:

open func __verifyPersonalization() throws

使用 do catch 可以正确处理错误,但返回值似乎丢失了。

我的 NS_REFINED_FOR_SWIFT 宏有什么遗漏吗?

【问题讨论】:

    标签: objective-c swift bridging


    【解决方案1】:

    这与NS_REFINED_FOR_SWIFT 宏无关。 Objective-C 方法

     - (BOOL) verifyPersonalizationWithError:(NSError **) error;
    

    被导入到 Swift 中

    open func verifyPersonalization() throws
    

    NS_REFINED_FOR_SWIFT 宏的唯一作用是在前面添加 Swift 方法名的下划线

    open func __verifyPersonalization() throws
    

    允许在扩展中提供精炼的 Swift 接口,同时保持原始实现可从精炼的接口调用 (请参阅Swift and Objective-C in the Same Project 中的“优化 Objective-C 声明”)。

    Swift 导入器假定 Objective-C 方法的布尔返回值表示成功或 失败,这是常见的 Cocoa 模式 如Using and Creating Error Objects 中所述:

    重要提示:成功或失败由方法的返回值指示。 虽然在 Cocoa 错误中间接返回错误对象的 Cocoa 方法 如果方法指示失败,则域保证返回此类对象 通过直接返回 nil 或 NO,您应该始终检查返回 在尝试对 NSError 对象执行任何操作之前,值为 nil 或 NO。

    Objective-C 中的一个典型用法是

    NSError *error;
    if ([self verifyPersonalizationWithError:&error]) {
        NSLog(@"success");
    } else {
        NSLog(@"failed: %@", error.localizedDescription);
    }
    

    Swift 方法在失败时会抛出错误,所以不需要 对于布尔返回值:

    do {
        try verifyPersonalization()
        print("success")
    } catch {
        print("failed:", error.localizedDescription)
    }
    

    如果Objective-C方法真的表示失败,离开 错误参数中的非空错误(而不是返回false,这是通常的 Cocoa 模式),那么您可以指出 通过添加属性:

    - (BOOL) verifyPersonalizationWithError:(NSError **) error
        __attribute__((swift_error(nonnull_error)));
    

    导入 Swift 为

    open func verifyPersonalization() throws -> Bool
    

    swift_error 属性记录在 https://github.com/apple/swift-clang/blob/383859a9c4b964af3d127b5cc8abd0a8f11dd164/include/clang/Basic/AttrDocs.td#L1800-L1819

    【讨论】:

    • 这是一个了不起的答案。希望我能不止一次地对此表示赞同。 ?
    • 我和戴夫在一起。这么好的答案。
    猜你喜欢
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-24
    • 2014-12-13
    • 2012-04-02
    • 2015-07-27
    相关资源
    最近更新 更多