いつも勉強させてもらっています。
タイトルの通り、associated valueを持つenumを作成し、
それを配列にして利用しています。
配列の変更が起こり得るので、その時点でのenumの条件のindexを取得し、
それをもとにenumにわけ、処理をしたいのですが、
どのようにしたらうまくindexを取得できるでしょうか?
stackoverflowにぴったり一致するものがありましたので、
参考に適応してみましたが、変数にして行うと、型が一致しているのに、しませんってエラーが出て困っております。
皆様の智恵をいただければ幸いです。
簡略化したサンプルを載せてみます。
Swift
1// CDCellのEnum 2enum CDPresentCell { 3 case titleCell(String?) 4 case artistCell(String?) 5 case releaseCell(Date?) 6} 7 8// CollectionView 9import UIKit 10 11class CDViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate { 12 @IBOutlet weak var collectionView: UICollectionView! 13 @IBOutlet weak var datePicker: UIDatePicker! 14 var cells:[CDPresentCell] 15 16 init() { 17 self.cells = [.titleCell(nil), 18 .artistCell(nil), 19 .releaseCell(nil) 20 ] 21 } 22 23 // 試した1個目 <- CDPresentCell と CDPresentCellが一致しないというエラーが出ました。 24 private fun returnRow1(cell: CDPresentCell) -> Int? { 25 var m: Int? = nil 26 for n in 0 ..< self.cells.count { 27 if cell == self.cells[n] { 28 m = n 29 } 30 } 31 return m 32 } 33 34 // コレ試した2個目 <- CDPresentCell と CDPresentCellが一致しないというエラーが出ました。 35 private func returnRow2(cell: CDPresentCell) -> Int? { 36 if let index = self.cells.firstIndex(where: { if case cell.self = $0 { return true }; return false }) { 37 return index 38 } 39 return nil 40 } 41 42 override func viewDidLoad() { 43 } 44 45 @IBAction func doneButtonPressed(_ sender: Any) { 46 if let row = self.collectionView.indexPathsForSelectedItems?.first?.row { 47 let cellType = self.cells[row] 48 switch cellType { 49 case .releaseCell(let data): 50 self.datePicker.alpha = 1.0 51 default: break 52 } 53 } 54 } 55 56 func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 57 return self.cells.count 58 } 59 60 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 61 let cellType = self.cells[indexPath.row] 62 switch cellType { 63 case .titleCell(let data): 64 let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "title", for: indexPath) as! TitleCell 65 cell.bind(data: data) 66 return cell 67 case .artistCell(let data): 68 let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "artist", for: indexPath) as! ArtistCell 69 cell.bind(data: data) 70 return cell 71 case .releaseCell(let data): 72 let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "release", for: indexPath) as! ReleaseCell 73 cell.bind(data: data) 74 return cell 75 } 76 77 func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 78 let cellType = self.cells[row] 79 switch cellType { 80 case .releaseCell(let data): 81 self.datePicker.alpha = 1.0 82 default: break 83 } 84 } 85 86 // collectionCellのtextFieldなどにdelegateを設定し、 87 // returnする場合にrowを数値で指定せずに、cellPresenterのself.cellsの 88 // enumからindexを取得し、更新に利用したいです。 89 func artistTextFieldDidReturn(text: String) { 90 let row = returnRow2(cell: .artist) // コレが働くようにしたい 91 let cellType = self.cells[row] 92 switch cellType { 93 case .titleCell(let data): 94 self.cells[row] = .titleCell(text) 95 default: break 96 } 97 self.collectionView.reloadItems(at: [[0, row]]) 98 } 99} 100
回答1件
あなたの回答
tips
プレビュー