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

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

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

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

Swift

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

Q&A

解決済

2回答

1141閲覧

SwiftのDate型→String型への変換が分かりません・・

Tommy2020

総合スコア18

Xcode

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

Swift

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

0グッド

1クリップ

投稿2020/08/19 14:06

Swiftで画面遷移時に受け取ったDete型の変数をUILabelに反映する際に
String型に変換を行う必要があるかと思いますが、エラーが出ていて、困っています。
原因お分かりになる方教えてください!
以下、ソースとエラー内容です。

import UIKit class decideTimeViewController: UIViewController { @IBOutlet weak var datelabel: UILabel! //画面遷移時に受け取る var firstdate : Date? //インスタンス化 let formatter: DateFormatter = DateFormatter() //型変換 let strFd = formatter.string(from: firstdate) override func viewDidLoad() { super.viewDidLoad() //ラベルに反映 datelabel.text = strFd.text } }

イメージ説明

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

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

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

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

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

guest

回答2

0

ベストアンサー

以下処理は、「viewDidLoad」メソッド内に書かないといけません。
参考となる質問

Swift

1//型変換 2let strFd = formatter.string(from: firstdate)

また、上記の処理を修正しても他の箇所でエラーが発生しませんでしょうか?
確認頂きたいのは以下2点です。

  • "formatter.string(from: firstdate)"で、"firstdate"をアンラップしてない("!")をつけていない
  • "datelabel.text = strFd.text"とあるが、".tetxt"は不要ではないか

ここまで挙げた点を修正した内容が、以下となります(これでも動かない場合、適宜修正をお願いいたします)

Swift

1import UIKit 2 3class ViewController: UIViewController { 4 5 @IBOutlet weak var datelabel: UILabel! 6 7 //画面遷移時に受け取る 8 var firstdate : Date? 9 //インスタンス化 10 let formatter: DateFormatter = DateFormatter() 11 12 override func viewDidLoad() { 13 super.viewDidLoad() 14 15 //型変換 16 let strFd = formatter.string(from: firstdate!) 17 18 //ラベルに反映 19 datelabel.text = strFd 20 } 21}

投稿2020/08/19 14:54

tsuki01

総合スコア1751

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

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

tsuki01

2020/08/19 14:56

すみません、ページリロード忘れで回答が被ってしまいました。。 問題の原因は、eytyet様が回答してくれている通りとなります。
Tommy2020

2020/08/20 12:27

エラーは出なくなったのですが、どうやら let strFd = formatter.string(from: firstdate!) がうまく行ってないみたいで、ラベルに反映されていません。 原因お分かりになりますか?
tsuki01

2020/08/20 12:54 編集

「DateFormatter」に対して、何もフォーマットを指定していないからではないでしょうか。 (こちらで試した感じだと、指定を追加したら日付が表示される様になりました。) 以下の様にフォーマット指定を追加したら日付が表示されませんでしょうか。 ※以下は適当に指定したフォーマットなので、好みのフォーマットに適宜変更をお願いいたします。 DateFormatterの使い方は、別途検索すると色々出てくるかと思います。 ========================= // フォーマット指定を追加 formatter.dateFormat = "yyyy-MM-dd 'at' HH:mm" //型変換 let strFd = formatter.string(from: firstdate!) =========================
Tommy2020

2020/08/21 10:36

指定が必要なんですね! できました。 ありがとうございます。
guest

0

クラスの各プロパティの初期値は、まだそのクラスが存在する前に、存在をきちんと開始するために、システムによって準備されます。この時には、まだ、decideTimeViewControllerビューコントローラー自身が存在していない状態なので、ビューコントローラーの他のプロパティを参照することはできません。

従って、strFdを初期化するのにformatterfirstdateも、使うことはできません。

ところで、firstdateを受け取るのは、prepare()で行うと思います。
文字列の作成は、表示するときになってから、firstdateを使って行うとよいです。

蛇足ですが、decideTimeViewControllerはクラスなので、大文字で始めるとよいです。commandキーを押しながらクラス名をクリックするとメニューがでるので、そこでrename...を選択すると、名前を変更できます。

投稿2020/08/19 14:36

eytyet

総合スコア803

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

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

Tommy2020

2020/08/20 12:29

ところで、firstdateを受け取るのは、prepare()で行うと思います。 文字列の作成は、表示するときになってから、firstdateを使って行うとよいです。 が理解できないのですが、具体的にご説明願えますか?
eytyet

2020/08/20 12:37

https://capibara1969.com/1060/ ここなどが参考になるかと思います。prepare()というデレゲートメソッドを使って、画面が遷移する時に、親から子ビューコントローラに値を渡す方法です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問