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

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

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

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

Q&A

解決済

1回答

1465閲覧

複数のピッカービューを表示させたい

burro

総合スコア12

Swift

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

0グッド

0クリップ

投稿2020/06/27 16:05

前提・実現したいこと

複数のピッカーを表示させたいのですがピッカーの行数に関するデリゲートとピッカーの最初の表示に関するデリゲートの部分にエラーが出てしまいます。どうしたら良いか教えていただけると幸いです

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

Missing return in a function expected to return 'Int' Missing return in a function expected to return 'String?'

該当のソースコード

import UIKit class ChangeViewController: UIViewController, UITextFieldDelegate,UIPickerViewDelegate,UIPickerViewDataSource{ var CLname: UITextField!//授業名 var CLgroup: UITextField!//分類選択ピッカー表示テキストフィールド var CLgroupPicker: UIPickerView!//授業分類ピッカー var CLtani: UITextField!//単位数表示テキストフィールド var CLteacher: UITextField!//教授名表示テキストフィールド var CLnumber: UITextField!//教室名表示テキストフィールド var CLzoomid: UITextField!//zoom ID表示テキストフィールド var CLzoompw: UITextField!//zoom PW表示テキストフィールド var HyoukaPicker: UIPickerView!//成績評価方法ピッカー var Hyouka : UITextField!//成績評価法表示テキストフィールド let grouplist : [String] = ["自学科科目(必修)","自学科科目(選択必修)","自学科科目","総合教養科目","キリスト教学","外国語科目","情報処理科目","自由選択科目","その他"] let Hyoukalist : [String] = ["平常点","期末試験","期末課題","授業内試験","通常課題","小テスト","その他"] var ToolBar : UIToolbar!//ピッカーツールバー override func viewDidLoad() { super.viewDidLoad() let navBar = UINavigationBar()//ナビゲーションバー navBar.frame = CGRect(x: 0,y: 50,width: 415,height: 60) let navItem : UINavigationItem = UINavigationItem(title: "月曜1限") navItem.leftBarButtonItem = UIBarButtonItem(title: "戻る",style: UIBarButtonItem.Style.plain, target: self, action: #selector(ChangeViewController.backbutton)) navBar.pushItem(navItem, animated: true) self.view.addSubview(navBar) let click = UIButton()//変更ボタン click.frame = CGRect(x:180, y:800, width: 100,height: 50) click.setTitle("変更", for: .normal) click.backgroundColor = UIColor.purple click.addTarget(self, action: #selector(ChangeViewController.changeButton), for: .touchUpInside) view.addSubview(click) CLname = UITextField()//授業名 CLname.delegate = self CLname.frame = CGRect(x: 50,y: 150,width: 300,height: 50) CLname.placeholder = "授業名" CLname.layer.borderColor = UIColor.lightGray.cgColor CLname.keyboardType = .default CLname.borderStyle = .roundedRect CLname.returnKeyType = .done self.view.addSubview(CLname) CLgroupPicker = UIPickerView()//分類ピッカー CLgroupPicker.frame = CGRect(x: 80,y: 200,width: self.view.frame.width, height: 300) CLgroupPicker.delegate = self CLgroupPicker.dataSource = self CLgroupPicker.tag = 1 ToolBar = UIToolbar(frame: CGRect(x:0,y: self.view.frame.size.height/6,width: self.view.frame.size.width,height: 40))//ツールバー作成 ToolBar.layer.position = CGPoint(x: self.view.frame.size.width/2,y: self.view.frame.size.height-20) let ToolBarButton = UIBarButtonItem(title: "完了", style: .done, target: self, action: #selector(self.onClick)) let spaceItem = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil) ToolBar.items = [spaceItem,ToolBarButton] CLgroup = UITextField()//分類ピッカー結果表示 CLgroup.delegate = self CLgroup.placeholder = "分類" CLgroup.borderStyle = .roundedRect CLgroup.frame = CGRect(x: 50,y: 240,width: 200,height: 50) CLgroup.textAlignment = NSTextAlignment.center CLgroup.layer.borderColor = UIColor.lightGray.cgColor CLgroup.layer.borderWidth = 1 CLgroup.inputView = CLgroupPicker CLgroup.inputAccessoryView = ToolBar self.view.addSubview(CLgroup) CLtani = UITextField()//単位数 CLtani.delegate = self CLtani.frame = CGRect(x: 280,y: 240,width: 80,height: 50) CLtani.placeholder = "単位数" CLtani.keyboardType = .default CLtani.borderStyle = .roundedRect CLtani.returnKeyType = .done self.view.addSubview(CLtani) CLteacher = UITextField() CLteacher.delegate = self CLteacher.frame = CGRect(x: 50,y: 330,width: 180,height: 50) CLteacher.placeholder = "教授名" CLteacher.keyboardType = .default CLteacher.borderStyle = .roundedRect CLteacher.returnKeyType = .done self.view.addSubview(CLteacher) CLnumber = UITextField()//教室名 CLnumber.delegate = self CLnumber.frame = CGRect(x: 50,y: 420,width: 90,height: 50) CLnumber.placeholder = "教室番号" CLnumber.keyboardType = .default CLnumber.borderStyle = .roundedRect CLnumber.returnKeyType = .done self.view.addSubview(CLnumber) CLzoomid = UITextField()//ZOOM ID CLzoomid.delegate = self CLzoomid.frame = CGRect(x: 50,y: 510,width: 150,height: 40) CLzoomid.placeholder = "ZoomID" CLzoomid.keyboardType = .default CLzoomid.returnKeyType = .done CLzoomid.borderStyle = .roundedRect self.view.addSubview(CLzoomid) CLzoompw = UITextField() CLzoompw.delegate = self CLzoompw.frame = CGRect(x: 210,y: 510, width: 150,height: 40) CLzoompw.placeholder = "ZOOM PW" CLzoompw.keyboardType = .default CLzoompw.returnKeyType = .done CLzoompw.borderStyle = .roundedRect self.view.addSubview(CLzoompw) HyoukaPicker = UIPickerView()//成績評価法ピッカー HyoukaPicker.frame = CGRect(x: 80,y: 200,width: self.view.frame.width, height: 300) HyoukaPicker.delegate = self HyoukaPicker.dataSource = self HyoukaPicker.tag = 2 Hyouka = UITextField()//成績評価法表示テキストフィールド Hyouka.delegate = self Hyouka.frame = CGRect(x: 50,y: 590,width: 72,height: 30) Hyouka.font = UIFont.systemFont(ofSize: 10) Hyouka.placeholder = "---" Hyouka.textAlignment = NSTextAlignment.center Hyouka.borderStyle = .roundedRect Hyouka.inputView = HyoukaPicker Hyouka.inputAccessoryView = ToolBar self.view.addSubview(Hyouka) } func numberOfComponents(in pickerView: UIPickerView) -> Int { return 1 }//ピッカー列数 func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { if pickerView.tag == 1 {return grouplist.count} else if pickerView.tag == 2 { return Hyoukalist.count}}//ピッカー行数=リスト数 func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { if pickerView.tag == 2{ return grouplist[row]} else if pickerView.tag == 2{ return Hyoukalist[row]} }//ピッカー最初の表示 func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { if pickerView.tag == 1{CLgroup.text = grouplist[row]} else if pickerView.tag == 2 {Hyouka.text = Hyoukalist[row]} }//ピッカーが選択されたときの挙動 @objc func onClick(){ CLgroup.endEditing(true) }//完了ボタンを押しピッカーを消す @objc func backbutton(_ sender:UIButton){ self.dismiss(animated: true, completion: nil) } @objc func changeButton(_ sender:UIButton){ let storyboard :UIStoryboard = self.storyboard! let changeview = storyboard.instantiateViewController(withIdentifier: "next")as! NextViewController changeview.clnamestring = self.CLname.text! changeview.clgroupstring = self.CLgroup.text! changeview.tanisuu = self.CLtani.text! changeview.teacherstring = self.CLteacher.text! changeview.clnumber = self.CLnumber.text! changeview.zoomId = self.CLzoomid.text! changeview.zoomPw = self.CLzoompw.text! self.present(changeview,animated: true,completion: nil) } // 改行ボタンを押した時の処理 func textFieldShouldReturn(_ CLname: UITextField) -> Bool { CLname.resignFirstResponder() return true } func textFieldshouldRetrun(_ CLtani: UITextField) -> Bool { CLtani.resignFirstResponder() return true } func textFieldshoudRetrun(_ CLteacher: UITextField) -> Bool { CLteacher.resignFirstResponder() return true } }

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

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

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

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

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

guest

回答1

0

ベストアンサー

全体的にインデントがC言語風ですが、Swift は Swift の流儀がありますから、それに揃えた方が良いかと思います。実行やコンパイルには影響でませんが、視認性が上がるため、コンパイルするまでもなくエラーに気づくことが多くなるというメリットがあります。

Missing return in a function expected to return 'Int'

これが出る理由は下記のコードにあります(下記のコードは Swift 風のインデントに修正したります)。

Swift

1 func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 2 if pickerView.tag == 1 { 3 return grouplist.count 4 5 } else if pickerView.tag == 2 { 6 return Hyoukalist.count 7 } 8 }//ピッカー

エラーメッセージは「Int型の return を期待しているのに return が無い」という旨のメッセージです。

たしかに、コード中にはreturnが二回出てきていて問題点なさそうに見えます。しかし、pickerView.tag1でもなく2でも無い場合はどうなるでしょうか。

このままだと該当する処理が無い場合には`Void`を返す関数となってしまい、上記のようなエラーとなってしまいます。

Swift のコンパイラは到達不能なコードや、想定外の到達をしたときの処理まで先回りして考慮してくれるため、コンパイル前からこのようなエラーを出す仕組みになっています。

解決方法としては、関数の末尾に必ずreturnを置くようにすることです。あるいは、fatalError()のように強制終了するようにしてもコンパイルエラーは出なくなるようです。

したがって

  • grouplist.count1でなければHyoukalist.countの値を返す
  • 1でも2でも無いときは何らかの値を返すようにする
  • 1でも2でも無いときはfatalError()で落とす

あたりが選択肢になるとおもいますので、ご希望に応じて選択していただければと思います。

もう一つのエラーも同様の理由ですので、同じ方法で修正していただけますでしょうか。


追記

tagを使うと可読性が悪いので、番号ではなくインスタンスで比較する方法もアリかと思います。

Swift

1 func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 2 if pickerView == CLgroupPicker { 3 return grouplist.count 4 } else if pickerView == HyoukaPicker { 5 return Hyoukalist.count 6 } 7 // ここには到達しないはず 8 fatalError(#function) 9 }//ピッカー行数=リスト数

UIPickerView は Equatable なので、==を使って比較することも可能です。

投稿2020/06/27 23:13

編集2020/06/28 23:54
TsukubaDepot

総合スコア5086

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

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

burro

2020/06/28 09:22

C言語で最初学んでいたので無意識にインデントがC言語風になっていたようです、これから気をつけるようにします。 fatalError()を入れることでエラーは解決したのですが、HyoukaPickerにgrouplistが表示されてしまいます。これはどこが問題なのでしょうか?
TsukubaDepot

2020/06/28 23:45

ざっとしかみていませんが、少なくとも func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { if pickerView.tag == 2{ return grouplist[row]} else if pickerView.tag == 2{ return Hyoukalist[row]} }//ピッカー最初の表示 がおかしくありませんでしょうか。 両方とも tag == 2 となっています。 ちなみに、C言語であれSwiftであれ、インデントを揃えないとこのようなミスも気付きにくいので、なるべく揃えるようにした方が良いかと思います。
TsukubaDepot

2020/06/28 23:52

回答本文に tag を使わない例も載せましたのでご検討ください。
burro

2020/06/29 08:40

指摘してくださったミスを直したら解決しました。追記の方も参考にさせて頂きます。大変勉強になりました。ありがとうございました
TsukubaDepot

2020/06/29 08:47

変数(プロパティ)名ですが、前回指摘しましたように小文字で始めるのが慣習なので、そのようにされると良いかと思います。 Swiftでは大文字で始まるのはクラス(構造体)名、小文字がプロパティとなっています。 たとえば、この規則に従わない場合、 if pickerView == CLgroupPicker という書き方をみると、プロパティ(に入っているインスタンス)とクラス名の同一性を見ているように誤解してしまいます。 そうではなく、今回は両方のプロパティに入っているのは同じインスタンスなのかを比べたいので、 if pickerView == clGroupPicker のようにした方が可読性もバグも減る、という理由があります。 また、viewDidLoad()内部のかなり長くなっているため、ある程度関数に分けた方が良いかと思います。 修正は多少なりともエラーを伴う可能性がありますが、以後の作業効率は明らかに上がりますので、ご検討いただければと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問