Objective C 到 Swift 带有 NSError 的完成语法
Objective C to Swift completion syntax with NSError
我正在尝试将以下内容重写为 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 参数,但是如果我尝试删除错误参数,我会收到一个编译器错误,说我的参数数量错误。否则,我得到 "cannot invoke getProductsPage an argument list of type (Int, completion:(Array, UInt, Bool, NSError)->Void)"。我尝试了其他几种方法,但 none 起作用了。有什么想法吗?我是不是做错了什么?
(如果相关,getProductsPage 的框架是 https://docs.shopify.com/mobile-buy-sdk/ios/api/Classes/BUYClient#//api/name/getProductsPage:completion: )
与 "Swift takes away NSError
parameters" 相关的问题与此处无关。首先,这只是一个 Swift 2 功能。其次,这适用于方法的 NSError **
参数,但不适用于 block/closure.
的 NSError *
参数
在这种情况下,问题可能是 block/closure 的参数是否为空。例如,NSError
参数当然应该是可选的(因为如果没有错误,它将是 nil
)。如果他们没有明确审计 class 的可空性,我怀疑 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 为你做 "code completion",它会准确地告诉你那些应该是什么。仅根据您与我们共享的文档 link 很难确定 Swift 界面是什么。因此,让 Xcode 向您展示这些参数应该是什么。
顺便说一句,您通常可以通过完全省略类型来简化问题。 Xcode editor/compiler 将为您推断出合适的类型:
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
}
我正在尝试将以下内容重写为 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 参数,但是如果我尝试删除错误参数,我会收到一个编译器错误,说我的参数数量错误。否则,我得到 "cannot invoke getProductsPage an argument list of type (Int, completion:(Array, UInt, Bool, NSError)->Void)"。我尝试了其他几种方法,但 none 起作用了。有什么想法吗?我是不是做错了什么?
(如果相关,getProductsPage 的框架是 https://docs.shopify.com/mobile-buy-sdk/ios/api/Classes/BUYClient#//api/name/getProductsPage:completion: )
与 "Swift takes away NSError
parameters" 相关的问题与此处无关。首先,这只是一个 Swift 2 功能。其次,这适用于方法的 NSError **
参数,但不适用于 block/closure.
NSError *
参数
在这种情况下,问题可能是 block/closure 的参数是否为空。例如,NSError
参数当然应该是可选的(因为如果没有错误,它将是 nil
)。如果他们没有明确审计 class 的可空性,我怀疑 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 为你做 "code completion",它会准确地告诉你那些应该是什么。仅根据您与我们共享的文档 link 很难确定 Swift 界面是什么。因此,让 Xcode 向您展示这些参数应该是什么。
顺便说一句,您通常可以通过完全省略类型来简化问题。 Xcode editor/compiler 将为您推断出合适的类型:
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
}