使用 NSError 的 Objective C 到 Swift 完成语法

Posted

技术标签:

【中文标题】使用 NSError 的 Objective C 到 Swift 完成语法【英文标题】:Objective C to Swift completion syntax with NSError 【发布时间】:2015-07-29 20:58:13 【问题描述】:

我正在尝试将以下内容重写为 Swift:

[client getProductsPage:0 completion:^(NSArray *products, NSUInteger page, BOOL reachedEnd, NSError *error) 
    if (error == nil) 
        self.products = products;
     else 
        // Handle errors here
    
];

我尝试过的几件事之一是:

client.getProductsPage(0, completion:(products:Array, page:UInt, reachedEnd:Bool, error:NSError) -> Void in
        if(error == nil) 
            self.products = products
         else 
            println("error")
        
    )

我知道 Swift 带走了 NSError 参数,但是如果我尝试删除错误参数,我会收到一个编译器错误,说我的参数数量错误。否则,我得到“无法调用 getProductsPage 类型的参数列表(Int,完成:(Array,UInt,Bool,NSError)-> Void)”。我尝试了其他几件事,但都没有奏效。有什么想法吗?我做错了什么吗?

(如果相关,getProductsPage 的框架是https://docs.shopify.com/mobile-buy-sdk/ios/api/Classes/BUYClient#//api/name/getProductsPage:completion:)

【问题讨论】:

我猜是 Swift 2.0? 好的,那么所有关于删除错误参数的讨论都不适用(因为这是 Swift 2.0 的要求)。但它不适用于块/闭包参数,所以无论如何这都没有实际意义。问题无疑只是该块/闭包的参数的可选性/类型。 【参考方案1】:

与“Swift 带走NSError 参数”相关的问题与此处无关。首先,这只是 Swift 2 的一个特性。其次,这适用于方法的NSError ** 参数,但不适用于块/闭包的NSError * 参数。

在这种情况下,问题可能是该块/闭包的参数的可空性。例如,NSError 参数当然应该是可选的(因为如果没有错误,它将是nil)。如果他们没有明确审核该类的可空性,我怀疑products 数组和error 引用都将是隐式展开的选项(例如分别为[AnyObject]!NSError!):

client.getProductsPage(1, completion:  (products: [AnyObject]!, page: UInt, reachedEnd: Bool, error: NSError!) -> Void in
    if error == nil 
        self.products = products
     else 
        // Handle errors here
    
)

如果您让 Xcode 为您完成“代码补全”,它会准确地向您展示那些应该是什么。仅根据您与我们共享的文档链接,很难确定 Swift 接口是什么。所以让 Xcode 告诉你这些参数应该是什么。

顺便说一句,您通常可以通过完全省略类型来简化问题。 Xcode 编辑器/编译器将为您推断出适当的类型:

client.getProductsPage(0)  products, page, reachedEnd, error in
    if error == nil 
        self.products = products   // you may have to do a cast here
     else 
        // Handle errors here
    

注意,如果您使用的是 Swift 2,则可以使用 guard,而不是:

client.getProductsPage(0)  products, page, reachedEnd, error in
    guard error == nil else 
        // Handle errors here
        return
    

    self.products = products   // you may have to do a cast here

【讨论】:

非常感谢 Rob,省略类型确实成功了!

以上是关于使用 NSError 的 Objective C 到 Swift 完成语法的主要内容,如果未能解决你的问题,请参考以下文章

Objective-C NSError 和 Java 错误

Objective-C 中错误(NSError)构造的解释(使用未声明的标识符“错误”)

Objective-C 在自定义方法中将 NSError 指针传递给 NSFileManager

我可以在 Objective-C 的 init 中包含 NSError** 作为参数吗?

iPhone/Objective C:无法删除文件

强制返回 `id` 和 inout NSError 的 Objective-C 方法桥接到可选返回