ios - 尝试实现 iAd 删除但得到 "AnyObject is not convertible to..."

标签 ios swift

我收到 5 条错误消息,告诉我 AnyObject不能转换为以下内容: NSString , SKProduct , Set<NSObject> ,和SKPaymentTransaction 。这是什么意思以及如何解决这个问题?

这是我正在使用的代码:

import UIKit
import StoreKit
import AVFoundation
import iAd

class ViewController: UIViewController,SKPaymentTransactionObserver, SKProductsRequestDelegate, ADBannerViewDelegate {

@IBOutlet var adBanner: ADBannerView!

var product: SKProduct!

override func viewDidLoad() {
    super.viewDidLoad()
    self.adBanner.hidden = true
    self.adBanner.delegate = self
    removeAdsButton.hidden = true

    if NSUserDefaults.standardUserDefaults().objectForKey("Ads")  == nil {
        SKPaymentQueue.defaultQueue().addTransactionObserver(self)
        self.getProductInfo();
    }
    if var status: AnyObject! = NSUserDefaults.standardUserDefaults().objectForKey("Ads"){
        if status as NSString == "purchased" {
            self.adBanner.removeFromSuperview()
            self.removeAdsButton.hidden = true;
            self.removeAdsButton.userInteractionEnabled = false
        }
        else{
            SKPaymentQueue.defaultQueue().addTransactionObserver(self)
            self.getProductInfo()
        }
    }


    audioPlayer = AVAudioPlayer(contentsOfURL: evilMusic, error: nil)
    audioPlayer.prepareToPlay()


}

// Hide status bar
override func prefersStatusBarHidden() -> Bool {
    return true
}

@IBOutlet weak var janitor: UIImageView!
@IBOutlet weak var removeAdsButton: UIButton!


var evilMusic = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("C", ofType: "m4a")!)
var audioPlayer = AVAudioPlayer()


override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

func bannerView(banner: ADBannerView!, didFailToReceiveAdWithError error: NSError!) {
    NSLog("%@",error)
}

func bannerViewDidLoadAd(banner: ADBannerView!) {
    self.adBanner.hidden = false
}

func bannerViewWillLoadAd(banner: ADBannerView!) {

}

func bannerViewActionDidFinish(banner: ADBannerView!) {

}

func productsRequest(request: SKProductsRequest!, didReceiveResponse response: SKProductsResponse!) {
    let products = response.products
    if (products.count != 0)
    {
        product = products[0] as SKProduct
    }
    removeAdsButton.hidden = false
}

func getProductInfo(){
    if (SKPaymentQueue.canMakePayments()){
        let productID:NSSet = NSSet(object: "com.evileye.removeads")
        let request:SKProductsRequest = SKProductsRequest(productIdentifiers: productID)
        request.delegate = self
        request.start()
    }
}

func storePurchase(){
    NSUserDefaults.standardUserDefaults().setObject("purchased", forKey:"Ads")
    NSUserDefaults.standardUserDefaults().synchronize()
    self.adBanner.removeFromSuperview()
    self.removeAdsButton.hidden = true
    self.removeAdsButton.enabled = false

}

func paymentQueue(queue: SKPaymentQueue!, updatedTransactions transactions: [AnyObject]!){
    for transaction:AnyObject in transactions {
        if let trans:SKPaymentTransaction = transaction as? SKPaymentTransaction{
            switch trans.transactionState {
            case .Purchased:
                SKPaymentQueue.defaultQueue().finishTransaction(transaction as SKPaymentTransaction)
                self.storePurchase()

                break;
            case .Failed:
                SKPaymentQueue.defaultQueue().finishTransaction(transaction as SKPaymentTransaction)
                break;
            case .Restored:
                SKPaymentQueue.defaultQueue().restoreCompletedTransactions()
                break;
            default:
                break;
            }
        }
    }
}



@IBAction func removeAdsTapped(sender: AnyObject) {
    let payment:SKPayment = SKPayment(product: product);
    SKPaymentQueue.defaultQueue().addPayment(payment);

}

最佳答案

if var status: AnyObject! = NSUserDefaults.standardUserDefaults().objectForKey("Ads"){
    if status as NSString == “purchased” {
        …
    }
}

我们以此为例。
您将 status 声明为 AnyObject!
并非每个 AnyObject 都可以转换为 NSString

要修复此错误,您应该使用 as?

if status as? NSString == “purchased”

这将检查您的状态是否是(或可以转换为)NSString 的实例,如果是,它将检查字符串是否等于 purchased.

如果 status 不是 NSString 或者它是一个字符串但不等于 purchased,它将失败

您的其他错误也是如此。您将需要检查他们的实例是否正确。

如果您 100% 确定您的值属于特定类型,您也可以使用

if status as! NSString == “purchased”

! 直接转换它但不测试它是否可以转换。
举个例子:如果你把一个字符串转换成整数,它会给你一个错误

关于ios - 尝试实现 iAd 删除但得到 "AnyObject is not convertible to...",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30143194/

相关文章:

ios - 在 ObjC 中工作,而不是在 swift 中工作。我在 swift 中使用 JSON 解析有什么问题

ios - 无法在 App Store 上分发 react-native iOS 应用程序

ios - swift : Switching tableview cells in cellForRowAtIndexPath

ios - 在 tableview 中点击的两个 Action

ios - 检测 UITextField 何时更改而不使用键盘快速

swift - 设置WKInterfaceGroup高度小于2点

swift - 在不创建新常量的情况下将可选值解包到保护条件中的预定义变量

ios - CCAction block "tweening"

Swift ViewController 类名称为 String

swift - 比较 SpriteKit 纹理