在 swift 3 中将 [AnyObject] 转换为 [Int]
converting [AnyObject] to [Int] in swift 3
我正在尝试创建一个数字数组并让用户将它们保存在他们的设备上。然而,当数据被保存时(通过使用 NSUserDefaults
方法)它被转换为一个 [AnyObject]
数组。我需要将它转换为 [Int]
的数组。这是我目前的做法:
class ProgressViewController: UIViewController {
let kUserDefault = UserDefaults.standard
var chartData = [Int]()
override func viewWillAppear(_ animated: Bool) {
let weighting = UserDefaults.standard.array(forKey: "chartData")
footer1.text = "\((weighting))"
}
@IBAction func AddGraphComponent(_ sender: UIButton) {
var weighText:UITextField!
let alert = UIAlertController(title: "Enter new Weight!", message: "Please enter your Weight, followed by the date in which your weight was recorded", preferredStyle: UIAlertControllerStyle.alert)
alert.addTextField { (weighText) in
weighText.placeholder = "Weight"
weighText.keyboardType = UIKeyboardType.numberPad
}
alert.addTextField { (dateText) in
dateText.placeholder = "Date (MM/YY)"
}
let confirmAction = UIAlertAction(title: "Save", style: UIAlertActionStyle.default) { (_) in
let field = alert.textFields![0] as? UITextField
let weigh = alert.textFields![1] as? UITextField
if (field?.text)! == "" || (weigh?.text)! == "" {
let alert1 = UIAlertController(title: "Error!", message: "Please fill in BOTH fields", preferredStyle: UIAlertControllerStyle.alert)
alert1.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil))
self.present(alert1, animated: true, completion: nil)
}else {
print((field?.text)!,(weigh?.text)!)
let dataInt:Int = Int((field?.text!)!)!
self.chartData.append(dataInt)
self.chartLegend.append((weigh?.text)!)
self.kUserDefault.set([self.chartData], forKey: "chartData") //as? [Int]
self.kUserDefault.set([self.chartLegend], forKey: "chartLegend")
self.kUserDefault.synchronize()
}
}
alert.addAction(UIAlertAction(title: "Cancel", style: UIAlertActionStyle.cancel, handler: nil))
alert.addAction(confirmAction)
self.present(alert, animated: true, completion: nil)
}
我试过 let weightData: Int = weighting as [Int]
但它崩溃并提示致命错误
我试过 print("\(weighting?[0] as! Int)")
但它崩溃说 Could not cast value of type '__NSCFArray' (0x109f6ae88) to 'NSNumber' (0x108df0300).
当我尝试
let weighting = UserDefaults.standard.array(forKey: "chartData") as! [Int]
print("\((weighting[0]))")
我的应用崩溃并提示 Could not cast value of type '__NSCFArray' (0x108190e88) to 'NSNumber' (0x107016300)
有什么方法可以将保存的数组从 [AnyObject]
转换为 [String]
或 [Int]
吗?
行中
self.kUserDefault.set([self.chartData], forKey: "chartData")
您正在保存类型为 [[Int]]
的对象,因为 chartData
已经是一个数组。
删除括号
self.kUserDefault.set(self.chartData, forKey: "chartData")
我正在尝试创建一个数字数组并让用户将它们保存在他们的设备上。然而,当数据被保存时(通过使用 NSUserDefaults
方法)它被转换为一个 [AnyObject]
数组。我需要将它转换为 [Int]
的数组。这是我目前的做法:
class ProgressViewController: UIViewController {
let kUserDefault = UserDefaults.standard
var chartData = [Int]()
override func viewWillAppear(_ animated: Bool) {
let weighting = UserDefaults.standard.array(forKey: "chartData")
footer1.text = "\((weighting))"
}
@IBAction func AddGraphComponent(_ sender: UIButton) {
var weighText:UITextField!
let alert = UIAlertController(title: "Enter new Weight!", message: "Please enter your Weight, followed by the date in which your weight was recorded", preferredStyle: UIAlertControllerStyle.alert)
alert.addTextField { (weighText) in
weighText.placeholder = "Weight"
weighText.keyboardType = UIKeyboardType.numberPad
}
alert.addTextField { (dateText) in
dateText.placeholder = "Date (MM/YY)"
}
let confirmAction = UIAlertAction(title: "Save", style: UIAlertActionStyle.default) { (_) in
let field = alert.textFields![0] as? UITextField
let weigh = alert.textFields![1] as? UITextField
if (field?.text)! == "" || (weigh?.text)! == "" {
let alert1 = UIAlertController(title: "Error!", message: "Please fill in BOTH fields", preferredStyle: UIAlertControllerStyle.alert)
alert1.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil))
self.present(alert1, animated: true, completion: nil)
}else {
print((field?.text)!,(weigh?.text)!)
let dataInt:Int = Int((field?.text!)!)!
self.chartData.append(dataInt)
self.chartLegend.append((weigh?.text)!)
self.kUserDefault.set([self.chartData], forKey: "chartData") //as? [Int]
self.kUserDefault.set([self.chartLegend], forKey: "chartLegend")
self.kUserDefault.synchronize()
}
}
alert.addAction(UIAlertAction(title: "Cancel", style: UIAlertActionStyle.cancel, handler: nil))
alert.addAction(confirmAction)
self.present(alert, animated: true, completion: nil)
}
我试过 let weightData: Int = weighting as [Int]
但它崩溃并提示致命错误
我试过 print("\(weighting?[0] as! Int)")
但它崩溃说 Could not cast value of type '__NSCFArray' (0x109f6ae88) to 'NSNumber' (0x108df0300).
当我尝试
let weighting = UserDefaults.standard.array(forKey: "chartData") as! [Int]
print("\((weighting[0]))")
我的应用崩溃并提示 Could not cast value of type '__NSCFArray' (0x108190e88) to 'NSNumber' (0x107016300)
有什么方法可以将保存的数组从 [AnyObject]
转换为 [String]
或 [Int]
吗?
行中
self.kUserDefault.set([self.chartData], forKey: "chartData")
您正在保存类型为 [[Int]]
的对象,因为 chartData
已经是一个数组。
删除括号
self.kUserDefault.set(self.chartData, forKey: "chartData")