值类型未桥接到 Objective-C 错误 - 使用 SKProductsRequest 时出现运行时错误
Value type is not bridged to Objective-C Error - Runtime error when using SKProductsRequest
我以前能够在 iOS 应用程序中设置应用程序内购买,但是当回到项目并迁移到 Swift 3 时,我得到了 运行 时间错误,控制台中没有错误,但我看到
Value type is not bridged to Objective-C Error
这是我请求产品时的以下功能
//Request Products
func requestProductInfo() {
if SKPaymentQueue.canMakePayments() {
let productIdentifiers = NSSet(array: productIDs)
//ERROR
let productRequest = SKProductsRequest(productIdentifiers: productIdentifiers as! Set<String>)
productRequest.delegate = self
productRequest.start()
}
else {
print("Cannot perform In App Purchases.")
}
}
有人知道这是怎么回事吗?我知道使用 Swift Array 和 Set with NSSet 可能会出现一些问题,但我已经尝试改变周围的情况但仍然出现错误。
var productIDs: Array<String?> = []
var productsArray = [SKProduct]()
func transactionAction() {
let payment = SKPayment(product: self.productsArray[self.selectedProductIndex] as SKProduct)
SKPaymentQueue.default().add(payment)
self.transactionInProgress = true
}
//Request Products
func requestProductInfo() {
if SKPaymentQueue.canMakePayments() {
let productIdentifiers = NSSet(array: productIDs)
let productRequest = SKProductsRequest(productIdentifiers: productIdentifiers as! Set<String>)
productRequest.delegate = self
productRequest.start()
}
else {
print("Cannot perform In App Purchases.")
}
}
func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
if response.products.count != 0 {
// print("\(response.products.map {p -> String in return p.localizedTitle})")
productsArray = response.products
}
else {
print("There are no products.")
}
if response.invalidProductIdentifiers.count != 0 {
print("\(response.invalidProductIdentifiers.description)")
}
print("Number of products in productsArray \(productsArray.count) - Number of products in productIDs \(productIDs.count)")
setPurchaseButton()
}
您是否尝试过更改此行:
var productIDs: Array<String?> = []
到这个?:
var productIDs: Array<String> = []
您可能需要根据此更改更改一些其他部分,但是有了这个您就不必使用冒险了 as!
:
let productIdentifiers = Set(productIDs)
let productRequest = SKProductsRequest(productIdentifiers: productIdentifiers)
如果需要将Set<String>
传递给方法,最好不要使用中间NSSet
。 Swift 3 最糟糕的新特性,id-as-Any,会造成灾难性后果。
我以前能够在 iOS 应用程序中设置应用程序内购买,但是当回到项目并迁移到 Swift 3 时,我得到了 运行 时间错误,控制台中没有错误,但我看到
Value type is not bridged to Objective-C Error
这是我请求产品时的以下功能
//Request Products
func requestProductInfo() {
if SKPaymentQueue.canMakePayments() {
let productIdentifiers = NSSet(array: productIDs)
//ERROR
let productRequest = SKProductsRequest(productIdentifiers: productIdentifiers as! Set<String>)
productRequest.delegate = self
productRequest.start()
}
else {
print("Cannot perform In App Purchases.")
}
}
有人知道这是怎么回事吗?我知道使用 Swift Array 和 Set with NSSet 可能会出现一些问题,但我已经尝试改变周围的情况但仍然出现错误。
var productIDs: Array<String?> = []
var productsArray = [SKProduct]()
func transactionAction() {
let payment = SKPayment(product: self.productsArray[self.selectedProductIndex] as SKProduct)
SKPaymentQueue.default().add(payment)
self.transactionInProgress = true
}
//Request Products
func requestProductInfo() {
if SKPaymentQueue.canMakePayments() {
let productIdentifiers = NSSet(array: productIDs)
let productRequest = SKProductsRequest(productIdentifiers: productIdentifiers as! Set<String>)
productRequest.delegate = self
productRequest.start()
}
else {
print("Cannot perform In App Purchases.")
}
}
func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
if response.products.count != 0 {
// print("\(response.products.map {p -> String in return p.localizedTitle})")
productsArray = response.products
}
else {
print("There are no products.")
}
if response.invalidProductIdentifiers.count != 0 {
print("\(response.invalidProductIdentifiers.description)")
}
print("Number of products in productsArray \(productsArray.count) - Number of products in productIDs \(productIDs.count)")
setPurchaseButton()
}
您是否尝试过更改此行:
var productIDs: Array<String?> = []
到这个?:
var productIDs: Array<String> = []
您可能需要根据此更改更改一些其他部分,但是有了这个您就不必使用冒险了 as!
:
let productIdentifiers = Set(productIDs)
let productRequest = SKProductsRequest(productIdentifiers: productIdentifiers)
如果需要将Set<String>
传递给方法,最好不要使用中间NSSet
。 Swift 3 最糟糕的新特性,id-as-Any,会造成灾难性后果。