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

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

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

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

Swift

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

Q&A

解決済

1回答

948閲覧

Double型の数値を配列で保存する方法を教えてください

YUSAA

総合スコア11

Xcode

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

Swift

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

0グッド

0クリップ

投稿2021/02/02 06:04

編集2021/02/02 06:05

前提・実現したいこと

Swiftで健康管理アプリを作っています。
Double型の数値を配列で保存したいのですが、エラーが発生してうまく保存できません。
Double型の数値を配列で保存する方法を教えてください。

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

Type of expression is ambiguous without more context

該当のソースコード

Swift

1class registerViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource, UITextFieldDelegate { 2 3 4 @IBOutlet weak var nameTextField : UITextField! 5 @IBOutlet weak var heinetuPickerView : UIPickerView! 6 @IBOutlet weak var setteiButton : UIButton! 7 @IBOutlet weak var heinetuLabel : UILabel! 8 9 var name = [String]() 10 11 var heinetuDate = [Double]() 12 13 let list2 : [Double] = [36.0,36.1,36.2,36.3,36.4,36.5,36.6,36.7,36.8,36.9,37.0,37.1,37.2,37.3,37.4,37.5] 14 15 override func viewDidLoad() { 16 super.viewDidLoad() 17 18 if UserDefaults.standard.object(forKey: "HeinetuDate") != nil { 19 heinetuDate = UserDefaults.standard.object(forKey: "HeinetuDate") as! [Double] 20 } 21 if UserDefaults.standard.object(forKey: "Name") != nil { 22 name = UserDefaults.standard.object(forKey: "Name") as! [String] 23 } 24 25 26 if #available(iOS 13.0, *) { 27 self.overrideUserInterfaceStyle = .light 28 } else { 29 // Fallback on earlier versions 30 } 31 32 nameTextField.placeholder = "ユーザー名を設定してください" 33 34 self.nameTextField.delegate = self 35 36 } 37 38 39 // PickerViewの設定 40 func numberOfComponents(in pickerView: UIPickerView) -> Int { 41 42 return 1 43 } 44 45 func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 46 47 return list2.count 48 } 49 50 func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 51 52 return String(format: "%.1f", list2[row]) 53 } 54 55 func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 56 57 let heinetu = list2[pickerView.selectedRow(inComponent: 0)] 58 59 heinetuLabel.text = "(heinetu)" 60 } 61 62 // TextFieldのタップ設定 63 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 64 nameTextField.resignFirstResponder() 65 66 // nametextFieldが空の時にアラートの表示 67 if nameTextField.text == "" { 68 69 let alert = UIAlertController(title: "警告", message: "入力が未完了です", preferredStyle: .alert) 70 71 let action = UIAlertAction(title: "OK", style: .default) { (action) in 72 // OKボタンを押した時のアクション 73 alert.dismiss(animated: true, completion: nil) 74 75 } 76 77 alert.addAction(action) 78 79 self.present(alert, animated: true, completion: nil) 80 81 } 82 } 83 84 // TextFieldのタップ設定 85 func textFieldShouldReturn(_ textField: UITextField) -> Bool { 86 87 nameTextField.resignFirstResponder() 88 89 // nametextFieldが空の時にアラートの表示 90 if nameTextField.text == "" { 91 92 let alert = UIAlertController(title: "警告", message: "入力が未完了です", preferredStyle: .alert) 93 94 let action = UIAlertAction(title: "OK", style: .default) { (action) in 95 // OKボタンを押した時のアクション 96 alert.dismiss(animated: true, completion: nil) 97 98 } 99 100 alert.addAction(action) 101 102 self.present(alert, animated: true, completion: nil) 103 104 } 105 106 return true 107 108 } 109 110 // 設定ボタンの設定 111 112 @IBAction func decide(_ sender: Any) { 113 114 //変数に入力内容を入れる 115 name.append(nameTextField.text!) 116 117 heinetuDate.append(Double(heinetuLabel.text)) 118

試したこと

heinetuDate.append(Double(heinetuLabel.text))でやってみましたが、上記のエラーが出てしまいました。

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

Xcode バージョン12.4

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーが出ている行は次の行だと思います。

Swift

1heinetuDate.append(Double(heinetuLabel.text))

まず、heinetuLabel.text はオプショナル型(textString?)なのですが、Double の引数はオプショナル型を取れないためアンラップする必要があります。

! を用いたアンラップ(Implicitly Optional Value)は基本的には使うことを避けるべきなのですが、現実的には heinetuLabel.textnil になることはない(空文字列 ""になる)ので、強制アンラップを使っても大丈夫だと思いますが、少しでも危険性を減らすには ?? (nil結合演算子)を使うことを検討してもいいかと思います。

一方、Double構造体の引数に文字列を渡した場合、その戻り値もまた Double? とオプショナル型になってしまいます。

理由は単純で、Double("abc") のように、数値として変換できない文字列を渡した場合に、それをエラーとして返す必要があるためです。

heinetuDate[Double] として定義された配列ですので、そこに Double? を入れることはできません。

そういうことを考慮した場合、たとえば

Swift

1heinetuDate.append(Double(heinetuLabel.text!) ?? -1)

のような感じで、まずはheinetuLabel.text!と強制アンラップしDouble に変換し、その結果が nil であれば、体温としてはまずあり得ない -1 を入れる、という解決策があるかと思います。

投稿2021/02/02 06:25

TsukubaDepot

総合スコア5086

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

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

YUSAA

2021/02/02 06:38

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問