我收到 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/