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

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

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

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

Swift

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

Q&A

解決済

1回答

349閲覧

swift3 家計簿について

asuuuuuuuuu7

総合スコア16

Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

Swift

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

0グッド

0クリップ

投稿2017/12/17 08:01

swift3

1import UIKit 2import RealmSwift 3 4class SecondViewController: UIViewController , UIPickerViewDelegate, UITextFieldDelegate,UIImagePickerControllerDelegate, UINavigationControllerDelegate, UIScrollViewDelegate{ 5 6 7 @IBOutlet weak var todoNameText: UITextField! 8 9 var pickerView: UIPickerView = UIPickerView() 10 let list = ["", "1", "2", "3", "4"] 11 12 func numberOfComponents(in pickerView: UIPickerView) -> Int { 13 return 1 14 } 15 16 func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 17 return list.count 18 } 19 20 func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 21 return list[row] 22 } 23 24 func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 25 self.todoNameText.text = list[row] 26 } 27 28 //func cancel() { 29 //self.textField2.text = "" 30 //self.textField2.endEditing(true) 31 //} 32 33 func done() { 34 self.todoNameText.endEditing(true) 35 } 36 37 func CGRectMake(_ x: CGFloat, _ y: CGFloat, _ width: CGFloat, _ height: CGFloat) -> CGRect { 38 return CGRect(x: x, y: y, width: width, height: height) 39 } 40 41 42 43 @IBOutlet weak var money: UITextField! 44 45 @IBOutlet weak var tableView: UITableView! 46 47 var toDoItems:Results<ToDo>?{ 48 do{ 49 let realm = try Realm() 50 return realm.objects(ToDo.self) 51 }catch{ 52 print("エラー") 53 } 54 return nil 55 } 56 57 init() { 58 super.init(nibName: nil, bundle: nil) 59 60/////////////////////////////☆Viewの背景色をGreenに設定する. 61 self.view.backgroundColor = UIColor.green 62 63 // tabBarItemのアイコンをFeaturedに、タグを2と定義する. 64 self.tabBarItem = UITabBarItem(tabBarSystemItem: UITabBarSystemItem.featured, tag: 2) 65 } 66 67 required init?(coder aDecoder: NSCoder) { 68 super.init(coder: aDecoder) 69 } 70 71 required override init(nibName nibNameOrNil: String!, bundle nibBundleOrNil: Bundle!) { 72 super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) 73 } 74 75 override func viewDidLoad() { 76 77// let item:ToDo = ToDo() 78// item.name = self.money.text! 79// if ((self.money.text?.characters.count)! > 0) { 80// item.money = Int(self.money.text!)! 81 82 83 84//////////////////Realm URL表示コード 85 print(Realm.Configuration.defaultConfiguration.fileURL!) 86 87 88 let data = try! Realm().objects(ToDo.self) 89 todoNameText.text = data.last?.name // last?を挟むと最新のレコード取得になります 90 //money.text = data.last?.money 91 92////////////////////////////名目のPicker view 93 94 pickerView.delegate = self as? UIPickerViewDelegate 95 pickerView.dataSource = self as? UIPickerViewDataSource 96 pickerView.showsSelectionIndicator = true 97 98 99 let toolbar = UIToolbar(frame: CGRectMake(0, 0, 0, 35)) 100 let doneItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(SecondViewController.done)) 101 //let cancelItem = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(manage.cancel)) 102 //toolbar.setItems([cancelItem, doneItem], animated: true) 103 toolbar.setItems([doneItem], animated: true) 104 105 106 self.todoNameText.inputView = pickerView 107 self.todoNameText.inputAccessoryView = toolbar 108 109 110 111 112 113 super.viewDidLoad() 114 115 let toDo = try! Realm().objects(ToDo.self) 116 117 result.text = toDo.last?.zandaka_chokin 118 119 } 120 121 override func didReceiveMemoryWarning() { 122 super.didReceiveMemoryWarning() 123 } 124/////////////////////////////☆ 125 126 @IBOutlet weak var zandaka_cyokin: UITextField! 127 128 @IBOutlet weak var result: UILabel! 129 130 131 @IBAction func z_Button(_ sender: Any) { 132 133 let realm = try! Realm().objects(ToDo.self) 134 let toDo = ToDo() 135 toDo.zandaka_chokin = zandaka_cyokin.text! 136 137 // ToDoデータを永続化する処理 138// do{ 139// let realm = try Realm() 140// try realm.write{ 141// realm.add(toDo) 142// } 143 zandaka_cyokin.text = "" 144// }catch{ 145// print("失敗") 146// } 147 148 result.text = toDo.zandaka_chokin 149 150 } 151 152 153 @IBAction func addToDo(_ sender: AnyObject) { 154 155 // 入力チェック 156 if isValidateInputContents() == false{ 157 return 158 } 159// 160 _ = try! Realm().objects(ToDo.self) 161 162 let x1 = Int(money.text!) 163 //let x2 = try! Realm().objects(ToDo.self).filter("0 < zandaka") 164 let x2 = Int(result.text!) 165 // let x8 = Int((x2.first?.zandaka)!) 166 167// 168// let x2 = try! Realm().objects(ToDo.self).filter("nil < zandaka") 169// 170// var x3 = Int((x2.first?.zandaka)!) 171// 172// //let x4 = x3.first.zandaka 173 174 if x2! > 0 { 175 _ = x2! - x1! 176 } else { 177 print("0未満です") 178 } 179 180 181 var _: String = String(describing: x1) 182 var _: String = String(describing: x2) 183 184 result.text = String(describing: x2) 185 186 187// money.text! = String(describing: x1) 188// 189// print(type(of: x2)) 190// print(type(of: x2.first)) 191 192 //mokuhyou_moneyのtextfieldをintに変換 193 //var _:Int? = Int(zandaka_new.text!) 194 195 // ToDoデータを作成する処理 196 let toDo = ToDo() 197 toDo.name = todoNameText.text! 198 toDo.money = money.text! 199 toDo.zandaka_chokin = zandaka_cyokin.text! 200 201 // ToDoデータを永続化する処理 202 do{ 203 let realm = try Realm() 204 try realm.write{ 205 realm.add(toDo) 206 } 207 todoNameText.text = "" 208 money.text = "" 209 //zandaka_cyokin.text = "" 210 }catch{ 211 print("失敗") 212 } 213 tableView.reloadData() 214 } 215 216 private func isValidateInputContents() -> Bool{ 217 // ToDo名のデータ入力 218 if let name = todoNameText.text{ 219 if name.characters.count == 0{ 220 return false 221 } 222 223 }else{ 224 return false 225 } 226 return true 227 228 } 229 230 } 231 232 233 234extension SecondViewController: UITableViewDataSource{ 235 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 236 237// let toDoItems = try!Realm().objects(ToDo.self) 238// return toDoItems.count 239 return toDoItems?.count ?? 0 240 } 241 242 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 243 244 let toDoItems = try!Realm().objects(ToDo.self) 245 246 let toDo = toDoItems[indexPath.row] 247 248 let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as! ToDoTableViewCell 249 // Realmに登録したデータをラベルに値設定 250 cell.nameLabel.text = toDo.name 251 cell.moneyLabel.text = toDo.money 252 253 254 print(toDo.name) 255 print(toDo.money) 256 257 return cell 258 } 259 260 //スワイプ削除処理 261 func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { 262 if editingStyle == UITableViewCellEditingStyle.delete { 263 264 let realm = try!Realm() 265 266 _ = try!Realm().objects(ToDo.self) 267 268 // これはRealmSwiftでデータを削除しているケース 269 let deleteHistory = self.toDoItems?[indexPath.row] 270 // トランザクションを開始してオブジェクトを削除します 271 try! realm.write { 272 realm.delete(deleteHistory!) 273 } 274 275 276 // TableViewを再読み込み. 277 self.tableView.reloadData() 278 279 280 } 281} 282 283 284} 285 286 287 288

TableViewで作成しているのですが、label(result.text)のところに「¥ptional」と出てきてしまい引き算された金額がうまく表示されません。
どなたかわかる方いましたら教えてください。

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

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

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

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

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

fuzzball

2017/12/18 00:52

label(result.text) がありません。
asuuuuuuuuu7

2017/12/18 04:30

回答ありがとうございます、すみませんどこにlabel(result.text)がないとダメなんでしょうか?
fuzzball

2017/12/18 04:35 編集

質問文に「label(result.text)のところに‥」と書いてあるのに、label(result.text) が見当たりません、という意味です。
asuuuuuuuuu7

2017/12/18 05:38

書き方が悪くてすみみません、多分 result.text = String(describing: x2)のところにoptionalt出ます
fuzzball

2017/12/18 05:50

money.text と result.text には数値しか入力されないことが保証されていますか?
asuuuuuuuuu7

2017/12/18 06:15

すみません、保証とは永続化ということではなのでしょうか?
fuzzball

2017/12/18 06:33 編集

money.text や result.text に数値以外の文字列(カラ文字列も含む)が入った状態で addToDo() が呼ばれることはありますか?という意味です。
asuuuuuuuuu7

2017/12/18 06:34

わかりやすい回答ありがとうございます。基本的には数値しか入れていないのでそのような文字列が入ることはありません。
asuuuuuuuuu7

2017/12/18 06:43

数値以外の文字列を入れるkとはありませんが、最後にStringに変換しています。
guest

回答1

0

ベストアンサー

  • x1とx2をアンラップする。 数値に変換できない場合は0にする。

swift

1let x1 = Int(money.text ?? "") ?? 0 2let x2 = Int(result.text ?? "") ?? 0
  • アンラップしてIntとして扱えるので、!付けてるところは外す。

swift

1if x2 > 0 { 2 _ = x2 - x1 3} else { 4 print("0未満です") 5}

投稿2017/12/18 06:48

fuzzball

総合スコア16731

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

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

asuuuuuuuuu7

2017/12/18 06:57

optionalは出なくなりましたが、引き算ができません。 何か原因わかりますか?
fuzzball

2017/12/18 06:58

引き算というのは _ = x2 - x1 のことでしょうか?
fuzzball

2017/12/18 07:27 編集

左辺が _ になっているので、引き算の結果はどこにも残ってないですよ。 なぜ _ にしているのでしょうか?
asuuuuuuuuu7

2017/12/18 08:08

すみません、ちゃんと指定したらできました…!!! ありがとうございます、ただテーブルに保存した際に複数行が入ってしまうのですが、空の送信もされているのでしょうか
asuuuuuuuuu7

2017/12/18 08:37

zandaka_chokinのtextfieldの空が送信されている可能性があります、解決しました、すみません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問