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

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

新規登録して質問してみよう
ただいま回答率
85.48%
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回答

2567閲覧

swiftで現在時刻から一番近い時刻を表示させるプログラムを書いたのですが、その時刻が過ぎても一番近い時刻が表示されるので、時間が過ぎたら次に近い時刻が表示されるようにしたい

ShintaroOKUMURA

総合スコア21

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グッド

1クリップ

投稿2016/11/30 14:35

###前提・実現したいこと
今バスアプリの時刻表のアプリを作っているのですが、
現在時刻から一番近い時刻を表示させるプログラムを書いたのですが、その時刻が過ぎても一番近い時刻が表示されるので、時間が過ぎたら次に近い時刻が表示されるようにしたいのですが、ここから先どう書いたらいいのかがわかりません。是非アドバイスお願いします。

###該当のソースコード

swift3.0

1import UIKit 2import Foundation 3 4func result() { 5 6let timeFormatter = DateFormatter() 7timeFormatter.dateFormat = "HH:mm:ss" 8let nowString = timeFormatter.string(from: NSDate() as Date) 9let nowTime = timeFormatter.date(from: nowString)! 10let jikokuArray: [(String, String)] = [("次のバス発車時刻 AM","9:10:00"),("次のバス発車時刻 AM","9:50:00"),("次のバス発車時刻 AM","10:10:00"),("次のバス発車時刻 AM","10:50:00"),("次のバス発車時刻 AM","11:10:00"),("次のバス発車時刻 AM","11:30:00"),("次のバス発車時刻 AM","11:50:00"),("次のバス発車時刻 PM","12:10:00"),("次のバス発車時刻 PM","12:50:00"),("次のバス発車時刻 PM","13:10:00"),("次のバス発車時刻 PM","14:10:00"),("次のバス発車時刻 PM","15:10:00"),("次のバス発車時刻 PM","15:20:00"),("次のバス発車時刻 PM","15:50:00"),("次のバス発車時刻 PM","16:05:00"),("次のバス発車時刻 PM","16:42:00"),("次のバス発車時刻 PM","16:50:00"),("次のバス発車時刻 PM","16:55:00"),("次のバス発車時刻 PM","17:00:00"),("次のバス発車時刻 PM","17:05:00"),("次のバス発車時刻 PM","17:50:00"),("次のバス発車時刻 PM","18:05:00"),("次のバス発車時刻 PM","18:35:00"),("次のバス発車時刻 PM","18:50:00"),("次のバス発車時刻 PM","19:05:00"),("次のバス発車時刻 PM","19:35:00"),("次のバス発車時刻 PM","19:35:00"),("次のバス発車時刻 PM","19:50:00"),("次のバス発車時刻 PM","20:05:00"),("次のバス発車時刻 PM","20:35:00"),("次のバス発車時刻 PM","21:05:00") ] 11 12let intervalArray: [TimeInterval] = jikokuArray.map({(_, time) in 13 let diff = timeFormatter.date(from: time) 14 return abs(nowTime.timeIntervalSince(diff ?? nowTime)) // 注 15}) 16let minimumTime = intervalArray.min() ?? 0.0 17if let minIndex = intervalArray.index(of: minimumTime) { 18 print("\(jikokuArray[minIndex].0):\(jikokuArray[minIndex].1)") 19} else { 20 print("本日のダイヤは終了しました。") 21} 22} 23 24result()

###試したこと
最小値を変えたりしてみたのですが、全く動きが変わらずでした。
原因はif文にあるような気をするんでしょうが、どうなんでしょうか?
###補足情報(言語/FW/ツール等のバージョンなど)
swift 3.0
xcode 8.0

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

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

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

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

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

guest

回答2

0

ベストアンサー

以下のようにすることで判定できると思います、試してみてください。

swift

1func result() { 2 3 let timeFormatter = DateFormatter() 4 timeFormatter.dateFormat = "HH:mm:ss" 5 let nowString = timeFormatter.string(from: NSDate() as Date) 6 let nowTime = timeFormatter.date(from: nowString)! 7 let jikokuArray: [(String, String)] = [("次のバス発車時刻 AM","9:10:00"),("次のバス発車時刻 AM","9:50:00"),("次のバス発車時刻 AM","10:10:00"),("次のバス発車時刻 AM","10:50:00"),("次のバス発車時刻 AM","11:10:00"),("次のバス発車時刻 AM","11:30:00"),("次のバス発車時刻 AM","11:50:00"),("次のバス発車時刻 PM","12:10:00"),("次のバス発車時刻 PM","12:50:00"),("次のバス発車時刻 PM","13:10:00"),("次のバス発車時刻 PM","14:10:00"),("次のバス発車時刻 PM","15:10:00"),("次のバス発車時刻 PM","15:20:00"),("次のバス発車時刻 PM","15:50:00"),("次のバス発車時刻 PM","16:05:00"),("次のバス発車時刻 PM","16:42:00"),("次のバス発車時刻 PM","16:50:00"),("次のバス発車時刻 PM","16:55:00"),("次のバス発車時刻 PM","17:00:00"),("次のバス発車時刻 PM","17:05:00"),("次のバス発車時刻 PM","17:50:00"),("次のバス発車時刻 PM","18:05:00"),("次のバス発車時刻 PM","18:35:00"),("次のバス発車時刻 PM","18:50:00"),("次のバス発車時刻 PM","19:05:00"),("次のバス発車時刻 PM","19:35:00"),("次のバス発車時刻 PM","19:35:00"),("次のバス発車時刻 PM","19:50:00"),("次のバス発車時刻 PM","20:05:00"),("次のバス発車時刻 PM","20:35:00"),("次のバス発車時刻 PM","21:05:00") ] 8 9 10 let resultArray: [(String, String)] = jikokuArray.filter({ 11 let diff = timeFormatter.date(from: $0.1) 12 return nowTime.timeIntervalSince(diff ?? nowTime) > 0 13 }) 14 15 if resultArray.count > 0, let result = resultArray.first { 16 print("\(result.0):\(result.1)") 17 } else { 18 print("本日のダイヤは終了しました。") 19 } 20}

投稿2016/12/01 10:58

編集2016/12/02 03:49
_Kentarou

総合スコア8490

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

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

ShintaroOKUMURA

2016/12/02 02:21

返信が遅くなり、申し訳ありません。回答ありがとうございます。今実行できる場所にいないので、夕方頃に帰宅する予定なのでそこから実行させようと思います。実行後またコメントさせていただきます。
fuzzball

2016/12/02 03:43

flatMapよりもfilterの方が良くないでしょうか?
_Kentarou

2016/12/02 03:51

あ、その通りですね、もとのコードから変更したので頭が働いてませんでしたー、修正Doneです。
ShintaroOKUMURA

2016/12/02 10:35

返事が遅くなり申し訳ありません。 今実行してみました。実行してみたところうまく一番近い時刻は表示はされず、一番初めのインデックスが表示されました。
ShintaroOKUMURA

2016/12/02 10:53

無事動きました。誠にありがとうございます! _Kentarou様、ベストアンサーを選ばしていただきます。 fuzzball様、アドバイスありがとうございます。
guest

0

「時刻 - 今の時刻」が、正数かつ最小なものを選べば良いのでは?

投稿2016/11/30 16:04

fuzzball

総合スコア16731

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

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

ShintaroOKUMURA

2016/12/01 02:17

いつもご返事をくださって誠にありがとうございます! 正数かつ最小のなものということはl et minimumTime = intervalArray.min() ?? 0.0 if let minIndex = intervalArray.index(of: minimumTime) { print("\(jikokuArray[minIndex].0):\(jikokuArray[minIndex].1)") } else { print("本日のダイヤは終了しました。") } ここのプログラムに問題があるということでしょうか??
fuzzball

2016/12/01 03:51

abs()って何か分かってますか?
ShintaroOKUMURA

2016/12/01 04:35

絶対値を出すということですね!
fuzzball

2016/12/01 04:44

絶対値にしてしまうと正負の判定が出来ないですよね?その辺りから見直さないといけません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問