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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

Q&A

1回答

1273閲覧

Cannot assign value of type '[String : Any]?' to type 'DateFormatter'

swifter

総合スコア15

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

0グッド

0クリップ

投稿2017/09/29 03:05

編集2017/09/30 17:06

UserDefaultを使い、TextFieldにUIDataPickerを使用して記入した年月日をDictionary型で保存しました。
その年月日が、カレンダーの月日と同じならば、ラベル表示を変更する(もしくはセルの色を変更する)というような仕様の自作誕生日カレンダーを作成しています。

DateFormatterで年月日の書式を合わせて、if文を用いて「イコールならば・・・」というふうにコードを書いていたのですが、エラーが出て解決できなくなりました。

解決策を教えていただきたいです。またもっと良い方法などあればご教授願いたいです。

環境は、Swift3、Xcode:Version 9.0 です。


誕生日者氏名、誕生日、誕生日通知タイミングを保存

//Dictionary型のデータを保存 let saveDefault = UserDefaults.standard let saveData: Dictionary = ["NAME":"name","BIRTH":textField,"ALART":textField2] as! [String : String] saveDefault.set(saveData, forKey:"SAVE")

ここでエラーが出ました

func conversionDateFormat(indexPath: IndexPath) -> String { dateForCellAtIndexPath(numberOfItem: numberOfItems) var formatter: DateFormatter = DateFormatter() formatter.dateFormat = "yyyy年MM月dd日" //Cannot assign value of type '[String : Any]?' to type 'DateFormatter' if formatter = UserDefaults.standard.dictionary(forKey: "BIRTH") {

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

ーーーーーー以下追記ーーーーーーー

func dateForCellAtIndexPath(numberOfItem: Int) { // ①「月の初日が週の何日目か」を計算する let ordinalityOfFirstDay = Calendar.current.ordinality(of: .day, in: .weekOfMonth, for: firstDateOfMonth()) for i in 0 ..< numberOfItems { // ②「月の初日」と「indexPath.item番目のセルに表示する日」の差を計算する var dateComponents = DateComponents() dateComponents.day = i - (ordinalityOfFirstDay! - 1) //dateComponents.day = i // ③ 表示する月の初日から②で計算した差を引いた日付を取得 let date = Calendar.current.date(byAdding: dateComponents as DateComponents, to: firstDateOfMonth() as Date)! // ④配列に追加 currentMonthOfDates.append(date as NSDate) } } // ⑵表記の変更 func conversionDateFormat(indexPath: IndexPath) -> String { dateForCellAtIndexPath(numberOfItem: numberOfItems) // // Pickされた日付Stringの準備 // var formatter: DateFormatter = DateFormatter() formatter.dateFormat = "yyyy年MM月dd日" let pickedDateString = formatter.string(from: ) //指定したformatで作成したStringを取得 if formatter == UserDefaults.standard.dictionary(forKey: "BIRTH") { //formatter.dateFormat = "d" return formatter.string(from: currentMonthOfDates[indexPath.row] as Date) }

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

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

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

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

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

t_obara

2017/09/29 05:16

textFieldはUITextFieldオブジェクトなのでは?textメソッドを利用してStringで書き込むのと、=は代入です。Date型にして比較した方が楽チンだと思います。
swifter

2017/09/29 05:37

textFieldはUITextFieldです。タップしたらUIDataPickerが出てきて、そこで年月日を選択するようにしました。そのようにしたらStringでTextFieldに反映されると思います。では、=ではなく==ですね、わかりました。Data型にして比較する方法がいまいちわかりません。どちらをどのようにすればいいのでしょうか?その場合は、DataFormatterは使用できないのでしょうか?
guest

回答1

0

TextFieldと内容のStringの関係はt_obara様のコメントのとおりです。

比較すべきは、DateFormatterでなく、DateFormatterで作ったStringですよ。それと、UserDefaultsに保存したのはDictionaryですよね。DictionaryをUserDefaultsから取り出して、取り出したDictionaryからStringを取り出さないといけないです。

Swift

1func conversionDateFormat(indexPath: IndexPath) -> String { 2 // 3 // Pickされた日付Stringの準備 4 // 5 let pickedDate = dateForCellAtIndexPath(numberOfItem: numberOfItems) //Pickした方のDateを取得 6 var formatter: DateFormatter = DateFormatter() 7 formatter.dateFormat = "yyyy年MM月dd日" 8 let pickedDateString = formatter.string(from: pickedDate) //指定したformatで作成したStringを取得 9 10 // 11 // 保存されている方の日付Stringの準備 12 // 13 let savedDictionary = UserDefaults.standard.dictionary(forKey: "SAVE") //まずDictionaryを取り出し。取り出されたdictionaryの型は[String:Any] 14 let savedDateString = savedDictonary["BIRTH"] as! String // Dictionaryからの値の取り出し。取り出した値はAny型なのでStringにキャストする。 15 16//Cannot assign value of type '[String : Any]?' to type 'DateFormatter' 17 if pickedDateString == savedDateString { // String同士の比較 18

全体的に、ひとつひとつ「この値の型は何なのか?」を確認しながらコーディングされた方が良いかと思います。

投稿2017/09/29 22:11

YokemuraTakeshi

総合スコア297

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

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

swifter

2017/09/30 06:57

ご回答ありがとうございます。また、型を意識した方がいいというアドバイスもありがとうございます。早速実践していこうと思います。DateFormatがData型なので、String型に変換して、DictionaryからString型で取り出した値と比較する。ということは理解できました。ところが、「let pickedData =...」の部分でエラーが発生してしまいました。「Constant 'pickedDate' inferred to have type '()', which may be unexpected」これは、変数には()を使えない、ということでしょうか?質問を重ねて申し訳ございませんが、教えていただければ嬉しいです。
YokemuraTakeshi

2017/09/30 07:23

DateFormatはDateFormat型ですよ。dateForCellAtIndexPathはfuncだと思いますが、戻り値が指定されていないのではないですか?それが type '()' の意味です。
swifter

2017/09/30 07:42

DataFormat型ですね。もう少し型についても勉強しようと思います。funcですが、おっしゃる通り、戻り値は設定されていません。それでも実装できるだろうと思って少し進んで見たら、「let pickedDateString = formatter.string(from: pickedDate) //指定したformatで作成したStringを取得 」の部分で、「Cannot convert value of type '()' to expected argument type 'Date'」というエラーが出てしまいました。戻り値が指定されていないとできないのでしょうか
YokemuraTakeshi

2017/09/30 08:16

関数について少し学ばれた方が良いかと思います
swifter

2017/09/30 08:53

了解致しました。 dateForCellAtIndexPathはfuncなのですが、それをfunc conversionDateFormat(indexPath: IndexPath) -> String メソッドで実行するため、dateForCellAtIndexPath(numberOfItem: numberOfItems)という記述がありました。実行するという記述を先ほどのようにpickedDataという変数に代入することは可能なのでしょうか?もし可能なのであれば、特に戻り値は必要ないように思うのですが。拙い知識ですが教えていただければ嬉しいです。
YokemuraTakeshi

2017/09/30 15:09

おそらくですが、関数の戻り値の扱い方や、インスタンス変数の意味などについて誤った理解があるように思えます。 conversionDateFormat(indexPath: IndexPath) -> String と dateForCellAtIndexPath(numberOfItem: numberOfItems) のコードを追記してください。多少ご案内できる部分があるかもしれません。
swifter

2017/09/30 17:08

確かに誤った理解だらけかもしれません。自分で調べて見て学んで入るのですが。。お手数をおかけして本当に申し訳ないです。 追記させていただきました。至らない知識ばかりにもかかわらず丁寧な対応、本当に感謝します。。ありがとうございます。
YokemuraTakeshi

2017/10/01 12:23

追記していただいたところ申し訳ないのですが、どのような意図なのかがよくわからないので、何をしようとしているコードなのか理解できませんでした。実現しようとしていること(ユーザー目線で)と、それをどういう手段で実現しようしたのか(こちらは技術視点で)をお教えいただければと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問