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

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

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

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

Swift

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

Q&A

解決済

1回答

1205閲覧

TableViewにDouble型の数値を表示する方法を教えてください。

YUSAA

総合スコア11

Xcode

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

Swift

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

0グッド

0クリップ

投稿2021/02/10 04:40

前提・実現したいこと

健康管理アプリを作っています。
TableViewに、小数点有りのDouble型の数値(体温)を、表示したいです。

発生している問題・エラーメッセージ

配列としてUserDefaultsで保存したDouble型の数値を、Stringに変換して表示するようにしましたが
どれも0.0となっていて、保存した値が表示されません。(TableViewはカスタムTableViewを利用しています。)

該当のソースコード

Swift

1 2class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 3 4 var healthNumber1 = [Double]() 5 6 var heinetuDate = [Double]() 7 8 var todayDate = [String]() 9 10 @IBOutlet weak var dateTableView : UITableView! 11 12 override func viewDidLoad() { 13 super.viewDidLoad() 14 15 let nib = UINib(nibName: "dateTableViewCell", bundle: nil) 16 dateTableView.register(nib, forCellReuseIdentifier: "dateTableViewCell") 17 18 // yyyy年MM月01日 12時 19 let lastDate = DateComponents(calendar: Calendar.current, day: 1, hour: 12).date! 20 21 // yyyy年MM月15日 11時 22 let now = DateComponents(calendar: Calendar.current, day: 15, hour: 11).date! 23 24 let lastDateStartOfDay = Calendar.current.startOfDay(for: lastDate) 25 let nowStartOfDay = Calendar.current.startOfDay(for: now) 26 27 let elapsedDays = Calendar.current.dateComponents([.day], from: lastDateStartOfDay, to: nowStartOfDay).day! 28 29 if elapsedDays > 14 { 30 31 todayDate.removeAll() 32 healthNumber1.removeAll() 33 34 UserDefaults.standard.set(healthNumber1, forKey: "HealthNumber1") 35 UserDefaults.standard.set(todayDate, forKey: "TodayDate") 36 } 37 38 } 39 40 override func viewDidAppear(_ animated: Bool) { 41 self.dateTableView.reloadData() 42 } 43 44 override func viewWillAppear(_ animated: Bool) { 45 super.viewWillAppear(animated) 46 47 if UserDefaults.standard.object(forKey: "HealthNumber1") != nil { 48 healthNumber1 = UserDefaults.standard.object(forKey: "HealthNumber1") as! [Double] 49 } 50 51 if UserDefaults.standard.object(forKey: "HeinetuDate") != nil { 52 heinetuDate = UserDefaults.standard.object(forKey: "HeinetuDate") as! [Double] 53 } 54 55 if UserDefaults.standard.object(forKey: "TodayDate") != nil { 56 todayDate = UserDefaults.standard.object(forKey: "TodayDate") as! [String] 57 } 58 59 } 60 61 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 62 if segue.identifier == "goThird" { 63 64 let thirdVc = segue.destination as! healthViewController 65 // 値を渡す 66 thirdVc.numberRow = Double((sender as! IndexPath).row) 67 68 } 69 70 } 71 72 73 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 74 75 return todayDate.count 76 } 77 78 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 79 80 let dateCell = tableView.dequeueReusableCell(withIdentifier: "dateTableViewCell") as! dateTableViewCell 81 82 dateCell.date2Label.text = todayDate[indexPath.row] 83 84 if UserDefaults.standard.object(forKey: "HealthNumber1") != nil { 85 let bodyNum = UserDefaults.standard.object(forKey: "HealthNumber1") as! [Double] 86 87 let strf : String = NSString(format: "%.1f", bodyNum) as String 88 89 dateCell.health2Label.text = strf 90 } 91 92 93 return dateCell 94 } 95 96 97 98}

試したこと

(format: "%.1f", bodyNum) as Stringの部分を、indexPath.rowとしてやりましたが、やり方が違うのかType 'NSString' has no member 'subscript'というエラーが出ました。

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

XCodeバージョン12.4

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

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

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

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

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

hoshi-takanori

2021/02/10 06:41

UserDefaults に Double の配列なんて保存できましたっけ?
YUSAA

2021/02/10 06:49

if UserDefaults.standard.object(forKey: "HealthNumber1") != nil { healthNumber1 = UserDefaults.standard.object(forKey: "HealthNumber1") as! [Double] } これでは、Doubleの配列データを呼び出せないのでしょうか?
YUSAA

2021/02/10 07:05

いえいえ、ご指摘ありがとうございます。
guest

回答1

0

ベストアンサー

質問を読んだかぎりおそらくstrf変数では、Doubleで入っているbodyNumの値それぞれをStringに変換したいのだと思いました。
UserDefaultsへの保存自体はできいますがうまく取り出せていないだけのように見えます。
この場合はstrfは[String]型で宣言する必要があると考えられます。
bodyNum変数は正しく[Double]で取れているはずですので、for文などで一つずつ値を取り出してStringに変換後、strf: [String]に保存すれば良いのではないでしょうか。

ちなみに、map関数を使うとおそらく一行で書けます。

let strf: [String] = bodyNum.map{NSString(format: "%.1f", $0) as String}

投稿2021/02/10 12:01

tmsah

総合スコア101

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

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

YUSAA

2021/02/10 12:09

回答ありがとうございます。下記のようにすると、Cannot assign value of type '[String]' to type 'String'というエラーが出てしまうのですが。 let strf: [String] = bodyNum.map{NSString(format: "%.1f", $0) as String} dateCell.health2Label.text = strf
tmsah

2021/02/10 12:13

添字部分を指定してあげる必要がありますね。 その上のdateCell.date2Label.textに代入している部分と同様に dateCell.health2Label.text = strf[indexPath.row] などとすると良いのではないでしょうか。
YUSAA

2021/02/10 12:49

解決しました!ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問