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

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

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

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

2回答

4453閲覧

Swift4 UserDefaults 配列、Date型の読み込みと追加

mogiruri

総合スコア37

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2018/11/21 09:56

編集2018/11/21 12:16

こんにちは。

作成中のアプリでデータ保存のためにUserDefaultsを使用しているのですが、DatePickerから取得したDateを保存した配列を取り出し、さらに追加しようとすると "Date has no member"というエラーが出ます。
String等はappendで追加できたのですが、dateはやり方が違うのですか?

以下トライしたコードです。

swift

1// save 2@IBOutlet weak var inputTitle: UITextField! 3@IBOutlet weak var picker: UIDatePicker! 4 5UserDefaults.standard.set(inputTitle.text!, forKey: "titleList") 6UserDefaults.standard.set(picker.date, forKey: "dateList") 7UserDefaults.standard.synchronize() 8 9// 変数の中身を書き換え後、それらを追加 10 11// read and append 12var getTitleList: String = UserDefaults.standard.array(forKey: "titleList") as! String 13var getDateList: Date = UserDefaults.standard.array(forKey: "dateList") as! Date 14 15getTitleList.append("(inputTitle.text!)") 16getDateList.append(picker.date)

よろしくお願いいたします。

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

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

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

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

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

fuzzball

2018/11/21 10:48

そもそも配列で保存出来てないんですけど?
mogiruri

2018/11/21 12:17

失礼しました、違う部分をコピーしていたみたいです。修正しました。
guest

回答2

0

わかりやすい回答、エスパーしてくださってありがとうございます。たしかに、データ型がアレイの場合はブランケットで囲む必要があるのでした。
初歩的なミスにお付き合いしていただきありがとうございます。

投稿2018/11/21 20:31

mogiruri

総合スコア37

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

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

0

ベストアンサー

保存している型と、値を読み込むときの型の不一致が原因です。

set()では、それぞれ String型と Date型を保存していますが、
array(forKey:)は Array型として読み込むメソッドで、保存した型がArray型でないとnilが返ります。

Value of type 'Date' has no member 'append' と表示されるのは、Date型にはappendというメソッドがないためです。append()はArray型のメソッドです。

そこで、やりたいことをエスパーして、次のように書き換えます。

swift

1 2UserDefaults.standard.set([inputTitle.text!], forKey: "titleList") 3UserDefaults.standard.set([picker.date], forKey: "dateList") 4 5// read and append 6var getTitleList: [String] = UserDefaults.standard.array(forKey: "titleList") as! [String] 7var getDateList: [Date] = UserDefaults.standard.array(forKey: "dateList") as! [Date] 8 9getTitleList.append("(inputTitle.text!)") 10getDateList.append(picker.date)

setで保存する型をArray<String>型, Array<Date>型にしました。
また、取り出す型もArray<String>型, Array<Date>型にしました。

ポイントとしては、

  1. UserDefaultsに保存する、取り出す型は一致させる。
  2. getTitleList, getDateListの型をArray型にする

でした。

投稿2018/11/21 13:58

d_date

総合スコア33

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問