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

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

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

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Swift

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

1037閲覧

UserDefaultsに配列を保存する

Amuy

総合スコア50

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Swift

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/01/10 10:39

編集2020/01/10 10:42

前提・実現したいこと

ゲームを作成しています
持っているアイテムの数をUserDefaultsに保存させたいのですが、
そのアイテムの数を保存しているのは配列で、ネットで調べて出てきた配列をUserDefaultsに保存する方法を試してもうまくいかなかったので、詳しい方に教えていただきたいです...

発生している問題・エラーメッセージ

配列にアイテムの数を追加するプログラム

swift

1UserDefaults.standard.set(self.udMyItemArray, forKey: "udMyItemArray") 2udMyItemNum[Deathblow] = udMyItemNum[Deathblow] + 1

エラー
Value of type 'UserDefaults' has no subscripts

UserDefaultsに配列を保存するプログラム

swift

1UserDefaults.set(udMyItemNumArray, forKey: "udMyItemNumArray")

エラー
Instance member 'set' cannot be used on type 'UserDefaults'; did you mean to use a value of this type instead?

該当のソースコード

swift

1import UIKit 2 3class ViewControllerShop: UIViewController { 4 @IBOutlet weak var imageDB: UIImageView! 5 @IBOutlet weak var PointLabel: UILabel! 6 @IBOutlet weak var LeftArrow: UIImageView! 7 @IBOutlet weak var RightArrow: UIImageView! 8 @IBOutlet weak var LetterLabel: UILabel! 9 @IBOutlet weak var DBTitleLabel: UILabel! 10 11 var udPoint = UserDefaults.standard 12 var udMyItem = UserDefaults.standard 13 var udMyItemArray: [String] = [] 14 var udMyItemNum = UserDefaults.standard 15 var udMyItemNumArray: [Int] = [0,0,0,0,0,0,0,0,0,0,0] 16 17 var timerLeftArrow:Timer! 18 var timerRightArrow:Timer! 19 var DBTitleArray: [String] = ["カミナリ","瞬足5","瞬足10","瞬足15","透明5","透明10","透明15","攻撃力上昇","防御","鈍足のカミナリ","豪速球"] 20 var DBImageArray: [String] = ["Thunder","Speed5","Speed10","Speed15","Invisible5","Invisible10","Invisible15","ATKRise","Shield","Electrical","BallSpeed"] 21 var DBLetterArray: [String] = ["ランダムで、敵のライフを1減らす\n150 PT","5秒間、足が速くなる\n100 PT","10秒間、足が速くなる\n150 PT","15秒間、足が速くなる\n200 PT","5秒間、透明になる\n150 PT","10秒間、透明になる\n250 PT","15秒間、透明になる\n350 PT","一回だけボールの攻撃力がUP\n200 PT","一回だけボールを防げる\n200 PT","ランダムで、敵の足を遅くする\n100 PT","一回だけボールのスピードがUP\n100 PT"] 22 var DBCostArray: [Int] = [150,100,150,200,150,250,350,200,200,100,100] 23 var Deathblow = 0 24 var getPointUD = 0 25 var getPoint2 = 0 26 27 override func viewDidLoad() { 28 super.viewDidLoad() 29 30 getPointUD = getPoint2 + udPoint.integer(forKey: "DataGetPoint") 31 LoadData() 32 33 timerLeftArrow = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: false, block:{ (t) in 34 UIView.animate(withDuration: 0.8, delay: 0.0, options: [.curveEaseIn, .repeat/*,.autoreverse*/], animations: { 35 self.LeftArrow.center.x -= 10.0 36 }) { _ in 37 //self.LeftArrow.center.x += 10.0 38 } 39 }) 40 41 timerRightArrow = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: false, block:{ (t) in 42 UIView.animate(withDuration: 0.8, delay: 0.0, options: [.curveEaseIn, .repeat/*,.autoreverse*/], animations: { 43 self.RightArrow.center.x += 10.0 44 }) { _ in 45 //self.LeftArrow.center.x += 10.0 46 } 47 }) 48 } 49 50 @IBAction func RightSwiped(_ sender: UISwipeGestureRecognizer) { 51 if Deathblow == 0 { 52 Deathblow = 11 53 } 54 Deathblow = Deathblow - 1 55 print(DBImageArray[Deathblow]) 56 print(Deathblow) 57 imageDB.image = UIImage(named: String(DBImageArray[Deathblow]) + ".png") 58 LetterLabel.text = String(DBLetterArray[Deathblow]) 59 DBTitleLabel.text = String(DBTitleArray[Deathblow]) 60 //print(DeathblowArray[0].components(separatedBy: "_")) 61 } 62 63 @IBAction func leftSwiped(_ sender: UISwipeGestureRecognizer) { 64 Deathblow = Deathblow + 1 65 if Deathblow == 11 { 66 Deathblow = 0 67 } 68 print(DBImageArray[Deathblow]) 69 print(Deathblow) 70 imageDB.image = UIImage(named:String(DBImageArray[Deathblow]) + ".png") 71 LetterLabel.text = String(DBLetterArray[Deathblow]) 72 DBTitleLabel.text = String(DBTitleArray[Deathblow]) 73 } 74 75 @IBAction func BuyButton(_ sender: Any) { 76 let alert: UIAlertController = UIAlertController(title: "TA・SU・KE", message: "本当に購入しますか?", preferredStyle: UIAlertController.Style.alert) 77 78 let defaultAction: UIAlertAction = UIAlertAction(title: "購入", style: UIAlertAction.Style.default, handler:{ 79 // ボタンが押された時の処理を書く(クロージャ実装) 80 (action: UIAlertAction!) -> Void in 81 //ここに購入ボタンを押した時のプログラムを書く 82 print("購入") 83 self.getPointUD = self.getPointUD - self.DBCostArray[self.Deathblow] 84 self.LoadData() 85 UserDefaults.standard.set(self.udMyItemArray, forKey: "udMyItemArray") 86 udMyItemNum[Deathblow] = udMyItemNum[Deathblow] + 1 87 self.BuyAlert() 88 }) 89 90 let cancelAction: UIAlertAction = UIAlertAction(title: "キャンセル", style: UIAlertAction.Style.cancel, handler:{ 91 // ボタンが押された時の処理を書く(クロージャ実装) 92 (action: UIAlertAction!) -> Void in 93 print("キャンセル") 94 }) 95 96 // ③ UIAlertControllerにActionを追加 97 alert.addAction(cancelAction) 98 alert.addAction(defaultAction) 99 100 // ④ Alertを表示 101 present(alert, animated: true, completion: nil) 102 } 103 104 func BuyAlert() { 105 // アラートを作成 106 let alert = UIAlertController( 107 title: "TA・SU・KE", 108 message: String(DBImageArray[Deathblow]) + "を購入しました", 109 preferredStyle: .alert) 110 111 // アラートにボタンをつける 112 alert.addAction(UIAlertAction(title: "OK", style: .default)) 113 114 // アラート表示 115 self.present(alert, animated: true, completion: nil) 116 } 117 118 func LoadData() { 119 UserDefaults.standard.set(getPointUD, forKey: "DataGetPoint") 120 PointLabel.text = String(getPointUD) + " PT" 121 UserDefaults.set(udMyItemNumArray, forKey: "udMyItemNumArray") 122 123 } 124 125 126 127 128} 129

どこを乗せればいいのかわからず全て載せました
わかりづらくてごめんなさい

試したこと

https://qiita.com/k_eita/items/d36b4cffd9fc6e133c70
https://teratail.com/questions/116214
を参考にした。

補足情報(FW/ツールのバージョンなど)

XcodeVersion 11.2.1

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

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

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

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

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

guest

回答1

0

ベストアンサー

UserDefaults.set(udMyItemNumArray, forKey: "udMyItemNumArray")
ではなく
UserDefaults**.standard**.set(udMyItemNumArray, forKey: "udMyItemNumArray")
ではないですか。

投稿2020/01/10 10:59

編集2020/01/10 11:00
dsuzuki

総合スコア1682

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

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

Amuy

2020/01/10 11:16

とても早い回答ありがとうございます! うまくいきました!
Amuy

2020/01/10 11:16

よろしければ UserDefaults.standard.set(self.udMyItemArray, forKey: "udMyItemArray") udMyItemNum[Deathblow] = udMyItemNum[Deathblow] + 1
Amuy

2020/01/10 11:17

の、足す方のプログラムも教えていただけませんでしょうか...?
Amuy

2020/01/10 11:46

UserDefaults.standard.set(self.udMyItemArray, forKey: "udMyItemArray") print(self.udMyItemNum.integer(forKey: "udMyItemArray")) で、userdefaultsの中身をprintしてみるとuserdefaultsの中身は0でした
dsuzuki

2020/01/10 11:46

udMyItemNum ではなく、 udMyItemNumArray ではないですか? それぞれの変数がどんな型で、どんな情報を格納しているのか、整理された方が良いです。
Amuy

2020/01/11 01:10

var udMyItem = UserDefaults.standard var udMyItemArray = [String]() //var udMyItemArray: [String] = [] var udMyItemNum = UserDefaults.standard var udMyItemNumArray: [Int] = [] //var udMyItemNumArray: [Int] = [0,0,0,0,0,0,0,0,0,0,0] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ print("購入") self.getPointUD = self.getPointUD - self.DBCostArray[self.Deathblow] UserDefaults.standard.set(self.udMyItemArray, forKey: "udMyItemArray") print(String(self.udMyItemNum.integer(forKey: "udMyItemNum"))) self.udMyItemNumArray[self.Deathblow] = self.udMyItemNumArray[self.Deathblow] + 1 print(self.udMyItemNumArray) self.LoadData() self.BuyAlert() ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ このようなプログラムにしてみました。 ショップでアイテムを購入すると、sumilatorが落ちて、 self.udMyItemNumArray[self.Deathblow] = self.udMyItemNumArray[self.Deathblow] + 1 のところに「Thread 1: Fatal error: Index out of range」 というエラーが出てきてしまいます。 エラーで調べてみてもxcodeがエラーを見つけられなかった時に出るエラーとしかわからず、 直すことができませんでした...
Amuy

2020/01/11 01:10

長文失礼しました
Amuy

2020/01/11 01:12

最初にvar udMyItemNumArray: [Int] = [0,0,0,0,0,0,0,0,0,0,0]でリセットされているから、2回目以降開くと0に戻っているのではないかと思い、var udMyItemNumArray: [Int] = []にしましたが、それでもエラーが出てしまいました。
dsuzuki

2020/01/11 08:24

Index out of range で検索しましたか? 変数の配列サイズ以上のindexを指定しているからエラーが発生しています。 var udMyItemNumArray: [Int] = []と宣言した時点で、udMyItemNumArrayの配列要素数はゼロです。 あと、udMyItemNumArrayをどこで宣言しているかわかりませんが、 インスタンス変数と、ローカル変数についても調査(勉強)してください。 それぞれが同じ変数名で共存できてしまいます。
Amuy

2020/01/13 01:18

UserDefaultsに配列を入れる&永続化できました! .standardをいれ忘れていたのと、forkeyが間違っていました。 アドバイスありがとうございした!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問