【问题标题】:Swift error: Could not cast value of type 'NSTaggedPointerString' (0x1a1264378) to 'NSNumber' (0x1a126f900)Swift 错误:无法将类型“NSTaggedPointerString”(0x1a1264378)的值转换为“NSNumber”(0x1a126f900)
【发布时间】:2016-07-06 18:37:03
【问题描述】:

我在 Xcode (swift) 中收到此错误:

无法将“NSTaggedPointerString”(0x1a1264378) 类型的值转换为“NSNumber”(0x1a126f900)。

我用 //ERROR: ("...") 明确了错误在哪里

代码:

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

        }
     }
 }

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    您正在将String 保存到NSUserDefaults,然后您正在阅读NSNumber。这是不可能的,这就是错误消息所说的。

    NSUserDefaults 有专门的方法来处理整数

    设置:

    • Swift 1 和 2:

      defaults.setInteger(2, forKey: "GetMute")
      
    • 斯威夫特 3:

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

      defaults.synchronize() 一般不需要。

    获取:

    • Swift 1 和 2:

      welkmute = defaults.integerForKey("GetMute") 
      
    • 斯威夫特 3:

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

    两个音符:

    • 切勿在 NSUserDefaults 中将 valueForKey 用于对象。我是objectForKey
    • 尽可能使用 Swift 原生类型(Int 而不是 NSInteger)。

    【讨论】:

    • 但请注意 defaults.setInteger 将在 Swift 3 中消失(它会被推断出来,但你不能显式调用它)。
    猜你喜欢
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-30
    • 2017-06-01
    相关资源
    最近更新 更多