2015-05-09 37 views
0

我收到5的錯誤信息,告訴我,AnyObject是無法轉換爲以下幾點:NSStringSKProductSet<NSObject>SKPaymentTransaction。這是什麼意思,我該如何解決這個問題?試圖實現iAd的去除,但得到「AnyObject是無法轉換爲...」

這是我使用的代碼:

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); 

} 

回答

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

讓我們以此爲例子。
您聲明statusAnyObject!
並非每個AnyObject都可以轉換爲NSString

要修正這個錯誤,你應該使用as?

if status as? NSString == 「purchased」 

這將檢查你的狀態是一個實例(或可鑄成)NSString,如果是,它會檢查字符串等於purchased

如果狀態沒有NSString或者如果它是一個字符串,但不等於purchased

這同樣適用於你的其他錯誤,它就會失敗。你需要檢查他們的實例是否正確。

如果你是100%肯定,你的價值將是一個特定類型的,你也可以使用

if status as! NSString == 「purchased」 

!種姓直接但不檢查它是否可以鑄造。
舉個例子:如果你把一個字符串作爲整數,它會給你一個錯誤

相關問題