前提・実現したいこと
Firebaseからデータを引っ張り出し、collectionView内に入れ込みたい。
変数snapsを定義し、計算した値をcollectinoviewのcellForItemAt内に入れ込みたい。
発生している問題・エラーメッセージ
コンソールには下記のように表示。
snaps () -> [String] 0x00000001041aebfc test4`closure #1 () -> Swift.Array<Swift.String> in variable initialization expression of test4.SecondViewController.snaps : () -> Swift.Array<Swift.String> at SecondViewController.swift:31
該当のソースコード
Swift
1import UIKit 2import Firebase 3 4class SecondViewController: UIViewController,UICollectionViewDelegate,UICollectionViewDataSource { 5 6・・・ 7 8 let ref = Database.database().reference().child("Second_Page") 9 @IBOutlet var collectionView: UICollectionView! 10 11 override func viewDidLoad() { 12 super.viewDidLoad() 13 collectionView.reloadData() 14 } 15//①配列snapsを定義。Firebaseからキーを取り出し、[key1,key2・・・]と設定したい。 16 var snaps = { () -> [String] in 17 var snapdate = NSDictionary() 18 Database.database().reference().child("Second_Page").child("user").child("ユーザー名").observeSingleEvent(of: .value) { (snap,error) in 19 snapdate = snap.value as! NSDictionary 20 } 21 return snapdate.allKeys as! [String] 22 } 23 24 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 25 let testCell:UICollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) 26//②("(snaps()[indexPath.row])")へ"key1"や、"key2"と入れ込みたい。 27 self.ref.child("user").child("ユーザー名").child("(snaps()[indexPath.row])").observeSingleEvent(of: .value) { snapshot in 28 ・・・ 29 } 30 31 }
試したこと
元々はcellForItemAt内で完結させており、想定した動きになっていました。
①の処理を外に出そうとしてからつまずいてしまいました。
1.同じ処理を何度かするため、処理をまとめようとする。
2.外に出そうと別メソッドとして定義しても、それが変数に反映されない
ここで躓き、クロージャーを使うと数値が入るとしり、クロージャとして定義。
3.クロージャーとしても型が合わず迷走入り・・・
Anyと定義したり、Stringと定義したり、メソッドの戻り値として設定しようとしたりしましたが、
いずれも型が合わない、ないしはメソッドの計算結果が反映されない状態に。
元々想定通りに動いていたコードが下記です。
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let testCell:UICollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) //①配列snapsを定義。Firebaseからキーのみ取り出し。(処理を外に出したい箇所) let ref = Database.database().reference().child("Second_Page") ref.child("user").child("ユーザー名").observeSingleEvent(of: .value) { (snap,error) in let snapdate = snap.value as! NSDictionary var snaps = snapdate.allKeys if snapdate == nil { return } //②("(snaps()[indexPath.row])")へ"key1"や、"key2"と入れ込みができていた。 ref.child("user").child("ユーザー名").child("(snaps[indexPath.row])").observeSingleEvent(of: .value) { snapshot in let value = snapshot.value as? NSDictionary let title = testCell.contentView.viewWithTag(1) as! UILabel let contents = testCell.contentView.viewWithTag(2) as! UILabel title.text = value?["main"] as? String ?? "" contents.text = value?["midlle_goal1"] as? String ?? "" }
以上、ご確認いただけますと幸いです。
どうぞ宜しくお願い致します。
補足情報(FW/ツールのバージョンなど)
Swift4
Target 12.0
FirebaseのRealTimeDataBaseを利用
あなたの回答
tips
プレビュー