Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/113.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用SKProductsRequest时,值类型未桥接到Objective-C错误-运行时错误_Ios_Swift_Swift3_Storekit - Fatal编程技术网

Ios 使用SKProductsRequest时,值类型未桥接到Objective-C错误-运行时错误

Ios 使用SKProductsRequest时,值类型未桥接到Objective-C错误-运行时错误,ios,swift,swift3,storekit,Ios,Swift,Swift3,Storekit,我以前能够在iOS应用程序中设置应用程序内购买,但是当回到项目并迁移到Swift 3时,我收到一个运行时错误,控制台中没有错误,但我看到了 值类型未桥接到Objective-C错误 这是我请求产品时的以下功能 //Request Products func requestProductInfo() { if SKPaymentQueue.canMakePayments() { let productIdentifiers = NSSet(array: productI

我以前能够在iOS应用程序中设置应用程序内购买,但是当回到项目并迁移到Swift 3时,我收到一个运行时错误,控制台中没有错误,但我看到了

值类型未桥接到Objective-C错误

这是我请求产品时的以下功能

//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.")
    }

}
//请求产品
func requestProductInfo(){
如果SKPaymentQueue.canMakePayments(){
让productIdentifiers=NSSet(数组:productId)
//错误
让productRequest=SKProductsRequest(productIdentifiers:productIdentifiers as!Set)
productRequest.delegate=self
productRequest.start()
}
否则{
打印(“无法执行应用内购买”)
}
}
有人知道发生了什么吗?我知道使用Swift数组和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=[]
var productsArray=[SKProduct]()
func transactionAction(){
let payment=SKPayment(产品:self.productsArray[self.selectedProductIndex]作为SKProduct)
SKPaymentQueue.default().add(付款)
self.transactionProgress=true
}
//请求产品
func requestProductInfo(){
如果SKPaymentQueue.canMakePayments(){
让productIdentifiers=NSSet(数组:productId)
让productRequest=SKProductsRequest(productIdentifiers:productIdentifiers as!Set)
productRequest.delegate=self
productRequest.start()
}
否则{
打印(“无法执行应用内购买”)
}
}
func productsRequest(uRequest:SKProductsRequest,didReceive response:SKProductsResponse){
如果response.products.count!=0{
//打印(\(response.products.map{p->String in return p.localizedTitle})
productsArray=response.products
}
否则{
打印(“没有产品”)
}
如果response.invalidProductIdentifiers.count!=0{
打印(“\(response.invalidProductIdentifiers.description)”)
}
打印(“productsArray\(productsArray.count)中的产品数)-ProductId\(ProductId.count)中的产品数)
setPurchaseButton()
}

您是否尝试过更改此行:

var productIDs: Array<String?> = []

如果需要将
Set
传递给方法,最好不要使用中间
NSSet
。Swift 3最糟糕的新功能,就像任何一个一样,都会带来灾难性的后果。

天哪,我真不敢相信我没有看到这一点,是的,现在一切都正常了;谢谢@在Swift的旧版本中,将一组选项传递给ObjC端会导致编译时错误。但对于任何新的id特性,程序员都需要格外小心。ObjC集合的值类型作为
Any
导入到Swift端,Swift端实际上消耗任何东西。Swift已成为一种类型安全的语言。。。小心,祝你和你的应用程序好运。
var productIDs: Array<String> = []
        let productIdentifiers = Set(productIDs)
        let productRequest = SKProductsRequest(productIdentifiers: productIdentifiers)