🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Xcode

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

Swift

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

Q&A

解決済

2回答

2022閲覧

swift4にてdate型の配列を作成したいです

Peter_Coter

総合スコア6

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Xcode

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

Swift

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

0グッド

0クリップ

投稿2019/12/23 13:26

編集2019/12/24 15:18

コードの修正及び新たな疑問点

お二方とも回答・ご指摘ありがとうございます。
いただいた助言をもとに下記のように書き直しました。

swift

1 let date = NSDate() 2 let format = DateFormatter() 3 format.locale = Locale(identifier:"ja_JP") 4 format.dateFormat = "HH:mm" 5 let nowdate = format.string(from: date as Date) 6 print(nowdate) //現在時刻を出力,(String型) 7 let nowdateA = format.date(from: nowdate) 8 print(type(of: nowdateA)) //Optional<Date>型 9 10 let A: Date! = format.date(from: "13:00") 11 let B: Date! = format.date(from: "18:00") 12 let C: Date! = format.date(from: "21:00") 13 let table:[Date] = [A, B, C] 14 for table in table{ 15 print("(table)") 16 } 17 print(type(of: table)) //Array<Date>型 18 19 let subtime = table.map { $0 - nowdateA} //ここでコンパイルエラー

エラー内容は次の通りです。
Value of optional type 'Date?' must be unwrapped to a value of type 'Date'

アンラップについて色々と調べ、nowdateA!やnowdateA?等やってみたのですがうまくいきません。
そこで、Optional<Date>型のアンラップ方法について教えていただければと思います。

見辛いコードで申し訳ありませんがよろしくお願いいたします。

---追記ここまで----

前提・実現したいこと

  1. swift4で、date型の配列を作成したいです。

イメージとしては
let table = ["13:00","18:00","22:00"]
のようなものです。(上の例だとstring型になる)
.
2. 作成したdate型の配列と現在時刻の差を求めたいと考えています。
これの私の中のイメージとしては
let subtable = table.map { $0 - nowdate(←現在時刻) }
です。(下記に詳細なコードを記載しています)

試したこと

  1. let table:Date = ["13:00","18:00","22:00"]とすると、

Cannot convert value of type '[String]' to specified type 'Date'
とエラーがでます。
.
2. let table = ["13:00","18:00","22:00"]
let date = NSDate()
let format = DateFormatter()
format.dateFormat = "HH:mm"
let nowdate = format.string(from: date as Date)
let subtime = table.map { $0 - nowdate }
上のようなコードにすると、
Binary operator '-' cannot be applied to two 'String' operands
とエラーがでます。

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

xcode 11.2.1
プログラミング初学者なので勘違いしている部分がありましたら
ご指摘いただけると幸いです。
よろしくお願いします。

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

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

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

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

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

nakasho_dev

2019/12/23 16:21

Date型の配列を作りたいのにString型で配列を作っても駄目ですよね。DateFormatterなどの知識があるのでしたら、まずはString型からDate型の変換を調べてみてはいかがでしょうか。
guest

回答2

0

自己解決

あれから色々と調べていると、私と同じことをしたい過去の質問が見つかりました。(下記URL)
このコードをもとに、バージョン違いによるエラーを修正することで望んでいた動作で動かすことができました。

詳しいソース解読は今からしていこうと思います。

ここで質問したことで新たな知識を得ることができました。お二方ともありがとうございました。
stack overflow

投稿2019/12/26 13:30

Peter_Coter

総合スコア6

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

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

0

最初の宣言が間違っています。
" "で囲んでいるものはStringとして認識されます。
なので、String型の配列を作成していることになります。
だから、計算できないよって言われています。

Swift

1let table = ["13:00","18:00","22:00"] // <- ここが間違いです 2 3let date = NSDate() 4let format = DateFormatter() 5format.dateFormat = "HH:mm" 6let nowdate = format.string(from: date as Date) 7let subtime = table.map { $0 - nowdate }

せっかくその後にDateformatterを使えているので、もったいないです。
最初に目的のDate型(13:00, 18:00, 22:00)を作成し、配列に格納する必要があります。

https://qiita.com/eKushida/items/541a65800efe1ffc523f#1文字列--日付へ変更

上記を参考にまず、Date型の配列を作成してください。

Swift

1// 最初は省略 2let A = format.date(from: "13:00") 3let B = format.date(from: "xxxx") 4let C = format.date(from: "xxxx") 5 6let table:[Date] = [A, B, C]

のように、
ちなみに13:00だけだといつの13:00か指定されていないので、
Date型の作成に失敗する気もしますが、、、
勝手に作成日の13:00で作成される気もします。

print出力し、確認してみてください。

投稿2019/12/23 16:26

hameji

総合スコア1380

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問