ios - 带有 NSError 的 Objective C 到 Swift 完成语法

标签 ios objective-c swift ipad

我正在尝试将以下内容重写为 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 带走 NSError 参数”相关的问题与此处无关。首先,这只是 Swift 2 的一个特性。其次,这适用于方法的 NSError ** 参数,但不适用于 block /闭包的 NSError * 参数。

在这种情况下,问题可能是该 block /闭包的参数的可空性。例如,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 接口(interface)是什么。因此,让 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
}

关于ios - 带有 NSError 的 Objective C 到 Swift 完成语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31710989/

相关文章:

ios - 使用 CGRectMake 重绘 UIButton 不会更新 UIButton 位置?

iphone - 如何使用 NSUserDefaults 在 iOS 中保存非属性值?

ios - UIScrollView 自动滚动 64 点

ios - 具有静态内容的 UIPageViewController

iphone - 加载某些 View 时如何隐藏 TabBarView?

ios - Interstitial iAd没有关闭 'X'按钮

ios - 如何使 self.view 成为 View Controller 的全高(同时占据导航栏和状态栏的高度)

ios - Sprite Kit 中允许的 categoryBitMask 的最大数量是多少?

swift - 如何判断第三方供应商框架是否是使用 "Defines Module"构建的?

ios - Swift 如何让一个函数在另一个函数完成后执行