首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NS_REFINED_FOR_SWIFT和返回值

NS_REFINED_FOR_SWIFT和返回值
EN

Stack Overflow用户
提问于 2017-08-08 10:31:57
回答 1查看 2K关注 0票数 3

我是Swift的新手,我开始探索一些与目标C连接的特性。

目前,我有一个带有NSError引用的方法,即:

代码语言:javascript
复制
- (BOOL) verifyPersonalizationWithError:(NSError **) error NS_REFINED_FOR_SWIFT;

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

代码语言:javascript
复制
open func __verifyPersonalization() throws

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

我的NS_REFINED_FOR_SWIFT宏缺少什么东西吗?

EN

回答 1

Stack Overflow用户

发布于 2017-08-08 10:47:35

这与NS_REFINED_FOR_SWIFT宏无关。目标C法

代码语言:javascript
复制
 - (BOOL) verifyPersonalizationWithError:(NSError **) error;

被导入到Swift作为

代码语言:javascript
复制
open func verifyPersonalization() throws

NS_REFINED_FOR_SWIFT宏的唯一效果是在Swift方法名称中加上下划线

代码语言:javascript
复制
open func __verifyPersonalization() throws

它允许在扩展中提供精化的Swift接口,同时使原始实现可以从精炼的接口中调用(请参阅迅速和目标-C在同一项目中中的"Refining声明“)。

Swift导入器假设目标-C方法的布尔返回值表示成功或失败,这是使用和创建错误对象中记录的常见Cocoa模式。

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

目标C中的一个典型用法是

代码语言:javascript
复制
NSError *error;
if ([self verifyPersonalizationWithError:&error]) {
    NSLog(@"success");
} else {
    NSLog(@"failed: %@", error.localizedDescription);
}

Swift方法在失败时抛出一个错误,因此不需要布尔返回值:

代码语言:javascript
复制
do {
    try verifyPersonalization()
    print("success")
} catch {
    print("failed:", error.localizedDescription)
}

如果Objective方法确实通过在error参数中留下一个非空错误来指示失败(而不是返回false,这是通常的Cocoa模式),那么您可以通过添加一个属性来指示这一点:

代码语言:javascript
复制
- (BOOL) verifyPersonalizationWithError:(NSError **) error
    __attribute__((swift_error(nonnull_error)));

它被导入到Swift作为

代码语言:javascript
复制
open func verifyPersonalization() throws -> Bool

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

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45565960

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档