質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

2回答

359閲覧

swift キャストできない

L85A2

総合スコア60

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2018/05/31 02:35

編集2018/05/31 03:04

swift

1import UIKit 2 3class ViewController:UIViewController ,UITextFieldDelegate { 4 5 6 @IBOutlet weak var result: UILabel! 7 8 @IBAction func save(_ sender: Any) { 9 let setting = 1 10 let encodedData = NSKeyedArchiver.archivedData(withRootObject: setting) 11 UserDefaults.standard.set(encodedData, forKey: "volume") 12 13 } 14 15 16 @IBAction func read(_ sender: Any) { 17 18 let anyObject: AnyObject! = UserDefaults.standard.object(forKey: "volume") as AnyObject 19 var userDefaluts:UserDefalutsController 20 21 if UserDefaults.standard.data(forKey: "volume") != nil { 22        //↓の行でエラー 23 userDefaluts = NSKeyedUnarchiver.unarchiveObject(with: (anyObject as! NSData) as Data) as! UserDefalutsController  24 25 26 userDefaluts.setAddNum(1) 27 result.text = String("(userDefaluts.getNum())") 28 } 29 30 } 31 32}

Swift

1import Foundation 2 3 4class UserDefalutsController: NSObject,NSCoding{ 5 let sourceName: String 6 var value: Double 7 8 init(sourceName: String, value: Double) { 9 self.sourceName = sourceName 10 self.value = value 11 } 12 required init(coder decoder: NSCoder) { 13 self.sourceName = decoder.decodeObject(forKey: "sourceName") as? String ?? "" 14 self.value = decoder.decodeDouble(forKey: "value") 15 } 16 17 func encode(with coder: NSCoder) { 18 coder.encode(sourceName, forKey: "sourceName") 19 coder.encode(value, forKey: "value") 20 } 21 22 func setAddNum(_ numner:Double){ 23 value += numner 24 } 25 func getNum() -> Double{ 26 return value 27 } 28 29}

NSObjectを使って、ファイルに、クラスを保存しのち、そのクラスを再利用したいです。
いくつか書き方が間違っているところがあると思いますが以下のエラーを最優先で解消したいです。

Could not cast value of type '__NSCFNumber' (0x1101662e8) to 'UserDefalults.UserDefalutsController' (0x10ec2ccb8).
2018-05-31 11:31:06.443461+0900 UserDefalults[2293:406973] Could not cast value of type '__NSCFNumber' (0x1101662e8) to 'UserDefalults.UserDefalutsController' (0x10ec2ccb8).
(lldb)

参考資料としてここをみながら試行錯誤で書きました。
http://blog.kaerusystem.jp/article/434175557.html

なぜキャストできないのかわかりませんか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2018/05/31 02:58 編集

どこでエラーが出ているのでしょうか? ※失礼、右にスクロールさせたら書いてありました。
L85A2

2018/05/31 03:07 編集

すごく醜い書方してました。ごめんなさい 編集で直しておきます
guest

回答2

0

CeratophrysさんのコードはsaveInt型をデータにして保存して、取り出すときにはUserDefalutsController型にしているので取り出せません。

以下の様にすると使いやすいと思います、コードを見ながら試してみてください。

swift

1 2import UIKit 3 4class ViewController: UIViewController { 5 6 @IBOutlet weak var result: UILabel! 7 8 override func viewDidLoad() { 9 super.viewDidLoad() 10 11 // 保存 12 let controller = UserDefalutsController(sourceName: "Name", value: 1.0) 13 UserDefaults.standard.userDefalutsController = controller 14 15 // 読み込み 16 if let controller = UserDefaults.standard.userDefalutsController { 17 controller.setAddNum(1.0) 18 print(controller.getNum()) 19 //=> 2.0 20 } 21 } 22} 23 24 25 26class UserDefalutsController: NSObject, NSCoding { 27 let sourceName: String 28 var value: Double 29 30 init(sourceName: String, value: Double) { 31 self.sourceName = sourceName 32 self.value = value 33 } 34 35 required init?(coder aDecoder: NSCoder) { 36 self.sourceName = aDecoder.decodeObject(forKey: "sourceName") as? String ?? "" 37 self.value = aDecoder.decodeDouble(forKey: "value") 38 } 39 40 func encode(with aCoder: NSCoder) { 41 aCoder.encode(sourceName, forKey: "sourceName") 42 aCoder.encode(value, forKey: "value") 43 } 44 45 func setAddNum(_ numner:Double){ 46 value += numner 47 } 48 func getNum() -> Double{ 49 return value 50 } 51} 52 53extension UserDefaults { 54 55 var userDefalutsController: UserDefalutsController? { 56 get{ 57 guard let data = self.object(forKey: "volume") as? NSData, 58 let controller = NSKeyedUnarchiver.unarchiveObject(with: data as Data) as? UserDefalutsController else { return nil } 59 return controller 60 } 61 set(controller) { 62 guard let controller = controller else { return } 63 let archive = NSKeyedArchiver.archivedData(withRootObject: controller) 64 self.set(archive, forKey: "volume") 65 } 66 } 67} 68

投稿2018/05/31 04:18

編集2018/05/31 04:19
_Kentarou

総合スコア8490

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

L85A2

2018/05/31 05:22

回答ありがとうございます。 extensionについて気になりました。 何故使われているのかがわからないのですが教えてもらえるでしょうか?
L85A2

2018/05/31 06:05

valueを初期値の1.0から2.0にした後保存したいのですが保存するメソッドはどのように書くと良いですか?
_Kentarou

2018/05/31 06:10 編集

UserDefaults.standard.userDefalutsController = controller で保存されます。保存、呼び出しの処理(データ型にして保存とか、呼び出してカスタムクラスに変換)をあちこちに書きたくないのでextensionにしてます。
L85A2

2018/05/31 06:16

的確なアドバイスでした。 おかげさまでコードの理解と保存ができるようになりましたヾ(^o^)ノ 読解力が乏しい分お手数かけました。 本当にありがとうございます。
guest

0

これでエラーは消えると思います。
動作確認はしてません。

swift

1@IBAction func read(_ sender: Any) { 2 if let data = UserDefaults.standard.data(forKey: "volume"), 3 let userDefalutsController = NSKeyedUnarchiver.unarchiveObject(with: data) as? UserDefalutsController { 4 userDefalutsController.setAddNum(1) 5 result.text = String("(userDefalutsController.getNum())") 6 } 7}

投稿2018/05/31 03:57

fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問