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

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

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

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

Xcode

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

Swift

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

Q&A

解決済

2回答

769閲覧

Swift/Xcodeの練習で簡単な年齢計算アプリを作りたいのですが。。。

taremen

総合スコア15

iOS

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

Xcode

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

Swift

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

0グッド

0クリップ

投稿2019/03/06 08:15

編集2019/03/06 08:37

前提・実現したいこと

Swift/Xcodeの練習で簡単な年齢計算アプリを作ろうとしていたのですが
日付の取得、計算の部分のコードにエラーが発生しています
どうしたら直りますでしょうか。。。

Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value

Swift初心者です。初めて投稿します。 特訓として誕生日計算のコードを組もうとしていたのですが、上記エラーが出てしまいます。

該当のソースコード

Swift

1 2import UIKit 3 4 5 6 7class ViewController: UIViewController { 8 9 @IBOutlet weak var yearTextField: UITextField! 10 @IBOutlet weak var monthTextField: UITextField! 11 @IBOutlet weak var dayTextField: UITextField! 12 @IBOutlet weak var resultLabel: UILabel! 13 14 15 override func viewDidLoad() { 16 super.viewDidLoad() 17 // Do any additional setup after loading the view, typically from a nib. 18 19 } 20 21 22 23 @IBAction func resultButton(_ sender: Any) { 24 let date:Date = Date() 25 let format = DateFormatter() 26 format.dateFormat = "yyyy" 27 let sDate = format.string(from: date) 28 29 30 let date2:Date = Date() 31 let format2 = DateFormatter() 32 format.dateFormat = "MM" 33 let sDate2 = format2.string(from: date2) 34 35 36 let date3:Date = Date() 37 let format3 = DateFormatter() 38 format.dateFormat = "DD" 39 let sDate3 = format3.string(from: date3) 40 41 42 43 let myYear: Int = Int(yearTextField.text!)! 44 var yourAge = Int(sDate)! - myYear 45 46 let myMonths: Int = Int(monthTextField.text!)! 47 let myDay: Int = Int(dayTextField.text!)! 48 49     //↓でエラーが出ています 50 if Int(sDate2)! < myMonths && Int(sDate3)! < myDay { 51 yourAge = yourAge - 1 52 resultLabel.text! = "あなたの年齢は" + (String(yourAge)) + "歳です" 53 54 }else if Int(sDate2)! < myMonths && Int(sDate3)! > myDay { 55 yourAge = yourAge - 1 56 resultLabel.text! = "あなたの年齢は" + (String(yourAge)) + "歳です" 57 58 }else if Int(sDate2)! > myMonths && Int(sDate3)! < myDay { 59 yourAge = yourAge - 1 60 resultLabel.text! = "あなたの年齢は" + (String(yourAge)) + "歳です" 61 62 }else { 63 resultLabel.text! = "あなたの年齢は" + (String(yourAge)) + "歳です" 64 } 65 66 67 68 }

試したこと

同じエラーが出ている方の記事などを参考に手を加えたりしたのですが
なかなか直せませんでした。。。

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

Swift4.2 Xcode10です
お力添えのほどよろしくお願いいたします。

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

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

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

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

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

t_obara

2019/03/06 08:46

「試したこと」でエラーについて貴殿がどのように考え、どのように修正しようとしたのか、もご提示いただくとよろしいと思います。また、問題が発生した場合、必要最小限の再現コードにして確認した方がご自身にとっても問題の切り分けや、問題のポイントが明確になるかと思います。
taremen

2019/03/06 09:59

@t_obara 様 ご指摘ありがとうございます。 エラーについて調べ、不要なものをつけたり取ったり移動したりと、 かなり的外れなことなども多々したと思うのですが、ここの投稿も初なもので、 どの程度の詳細が必要なのか把握できておりませんでした。 順を追って修正させていただきます。 また必要最小限の再現コードにつきましても、 これまた初心者すぎてどの程度まで記載すればご理解いただけるのか 皆目見当がつきませんでした。そのためまるっと載せてしまいました。 その点につきましても精進してまいります。
fuzzball

2019/03/07 04:31

if Int(sDate2)! < myMonths && Int(sDate3)! < myDay { この行でエラーが出ているのであれば、ここに出てくる変数の値くらいは調べて書いて下さい。
taremen

2019/03/08 01:29

@fuzzball 様 ご指摘ありがとうございます。
guest

回答2

0

ベストアンサー

Int(sDate2)!
Int(sDate3)!

上のどちらかがnilになっているのでしょう。

nilになっているオプショナル変数をビックリマークを使って強制的にアンラップすると、そのようにクラッシュします。
(文字列を整数に変換できない場合はnilになる仕様です。)

普通は

swift

1if let date2 = Int(sDate2), let date3 = Int(sDate3) { 2 // アンラップできたときだけここを通る 3}

やguardなどを使って(ビックリマークを使わずに)安全にアンラップをします。

オプショナルについて勉強されると良いかと思います。


追記

オプショナル以前の問題でした。
Dateから日付などの情報を取るにはCalendar.componentを使うのが一般的かと思います。
以下の記事を参考にしてください。

Swift 3 の日時操作チートシート
https://qiita.com/mishimay/items/8d67b583dc6809b2baf5

投稿2019/03/06 08:44

編集2019/03/06 08:50
takabosoft

総合スコア8356

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

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

taremen

2019/03/08 01:39 編集

@takabosoft 様 ご回答、また参考記事まで記載いただきありがとうございます。 まずはCalender.component触ってみます。 オプショナルもまだまだ理解が乏しいので勉強します。 ※追記 無事思っていたものが作れました。 ネットにあった記事をいただき、自分の調査不足も痛感しました。 また複雑に考えすぎていたこともあり、こんなスッキリまとめる方法があるのかと とても感銘を受けました。 ご親切なご回答ありがとうございました。 今後とも精進いたします!
guest

0

日付のフォーマットは D(大文字) ではなく、d(小文字) です。

投稿2019/03/06 08:43

dsuzuki

総合スコア1682

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

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

taremen

2019/03/07 04:17

@dsuzuki 様 ご回答ありがとうございます。 "DD" → "dd" という解釈でよろしいでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問