Tristan Diependael
Tristan Diependael

Reputation: 623

Swift error: Could not cast value of type 'NSTaggedPointerString' (0x1a1264378) to 'NSNumber' (0x1a126f900)

I get this error in Xcode (swift):

Could not cast value of type 'NSTaggedPointerString' (0x1a1264378) to 'NSNumber' (0x1a126f900).

I made it clear where the error is with //ERROR: ("...")

Code:

import UIKit
import iAd
import AVFoundation
import AudioToolbox

let MAX : UInt32 = 4
let MIN : UInt32 = 1

class ViewController: UIViewController, ADBannerViewDelegate {


  var chances = 10
  var won = 0
  var highscore = 0
  var random = Int(arc4random_uniform(MAX) + MIN)
  var sound = 1022 //sound if you won
  var sound2 = 1105 //sound if reset
  var sound3 = 1321 //sound if lose
  var welkmute = 1 //mute = 1 and unmute = 2

  @IBOutlet weak var timeswon: UILabel!
  @IBOutlet weak var Banner: ADBannerView!
  @IBOutlet weak var Highscores: UILabel!
  @IBOutlet weak var mute: UIButton!
  @IBOutlet weak var unmute: UIButton!
  @IBOutlet weak var chancesleft: UILabel!




  func unmUte() {
    unmute.setTitleColor(UIColor.redColor(), forState: UIControlState())
    mute.setTitleColor(UIColor.blueColor(), forState: UIControlState())

  }

  func mUte() {
    mute.setTitleColor(UIColor.redColor(), forState: UIControlState())
    unmute.setTitleColor(UIColor.blueColor(), forState: UIControlState())
  }


  override func prefersStatusBarHidden() -> Bool {
    return true
  }

  @IBAction func Mute(sender: AnyObject) {
    sound = 4095
    sound2 = 4095
    sound3 = 4095
    mUte()

    defaults.setObject("1", forKey: "GetMute")
    defaults.synchronize()

  }

  @IBAction func Unmute(sender: AnyObject) {
    sound = 1022
    sound2 = 1105
    sound3 = 1321
    unmUte()

    defaults.setObject("2", forKey: "GetMute")
    defaults.synchronize()

  }

  override func viewDidLoad() {
    super.viewDidLoad()

    //unmUte()

    Banner.hidden = true
    Banner.delegate = self
    self.canDisplayBannerAds = true


    if defaults.valueForKey("GetHighScore") != nil {
        highscore = defaults.valueForKey("GetHighScore") as! NSInteger
    }

    Highscores.text = "Highscore: \(highscore)"



    if defaults.valueForKey("GetMute") != nil {
        welkmute = defaults.valueForKey("GetMute") as! NSInteger   //ERROR: (Thread 1: breakpoint 3.1)

        if welkmute == 1 {
            mUte()
        }

        if welkmute == 2 {
            unmUte()

        }
     }
 }

Upvotes: 3

Views: 5461

Answers (1)

vadian
vadian

Reputation: 285039

You are saving a String to NSUserDefaults and then you are reading a NSNumber. That's not possible and that's what the error message says.

NSUserDefaults has dedicated methods to handle integers

Set:

  • Swift 1 and 2:

    defaults.setInteger(2, forKey: "GetMute")
    
  • Swift 3:

    defaults.set(2, forKey: "GetMute")
    

    defaults.synchronize() is generally not needed.

Get:

  • Swift 1 and 2:

    welkmute = defaults.integerForKey("GetMute") 
    
  • Swift 3:

    welkmute = defaults.integer(forKey:"GetMute") 
    

Two notes:

  • Never use valueForKey in NSUserDefaults for objects. It's objectForKey.
  • Whenever possible use Swift native types (Int rather than NSInteger).

Upvotes: 1

Related Questions