【Swift】配列、辞書の基礎文法

配列の指定位置に要素を挿入する

//配列の指定位置に要素を挿入
var array = [0,1,2]
array.insert(9, at: 0) //[9,0,1,2]
array.insert(8, at: 4) //[9,0,1,2,8]

 

配列をソートする

//配列のをソート
//昇順
array = array.sorted()
print(array) //[0, 1, 2, 8, 9]
//降順
array = array.sorted(by: {$0 > $1})
print(array) //[9, 8, 2, 1, 0]

 

辞書のキーと値をfor文で取り出す

//辞書が持つ全ての要素を調べる
var dic = ["one":1, "two":2, "three":3]
for (k, v) in dic {
    print(k, v)
    /*
     one 1
     two 2
     three 3
    */
    //ただし、取り出される順番は保証されない
}

 

辞書の要素を削除する 

//辞書の要素を削除する
dic.removeValue(forKey: "one") //["two":2, "three":3]
dic.removeAll() //[]

 

【Swift】Firebaseからデータを順番に取り出す

 

解説

 

・過去の記事で、Firebaseからデータを取得する方法を紹介した

nekokichi2yos2.hatenablog.com

 

・しかし、上記の方法では、取り出すデータの順番がバラバラになってしまう

 

・そこで、今回は順番に取り出す方法を紹介する

・データを投稿順に(昇順に)ソートする場合、ソートするためのデータを保存しなくても、データの階層(childByAutoId)でソートできる

・childByAutoId()は乱数の階層を生成するが、sorter()メソッドを使用すれば、登録順にデータをソートしてくれる 

・下記のデータベースを例にする場合、

f:id:nekokichi_yos2:20181109150637p:plain

  1. let snapdata = snap.value as? [String:NSDictionary]で、全ての階層を取得
  2. for key in snapdata!.keys.sorted() {} で、変数keyに階層を順に代入していく
  3. let snap = snapdata![key]で、階層内にある全てのデータを辞書でsnapに代入
  4. if let roomname = snap!["RoomName"] as? String {} で、roomnameに"RoomName"のキーで保存された値("はわはわ")を代入

という流れになる。

 

チャットアプリや掲示板アプリなどを作る際、是非とも参考にしてくれたまえ。

 

ソースコード

 

//Firebaseからルーム一覧を取得する
    func loadData_Firebase() {
        //Databaseの参照URLを取得
        let ref = Database.database().reference()
        //データ取得開始
        ref.child("post").child("RoomList").observeSingleEvent(of: .value) { (snap, error) in
            //RoomList下の階層をまとめて取得
            let snapdata = snap.value as? [String:NSDictionary]
            //データを取得する配列
            self.roomArray = [String]()
            //もしデータがなければ無反応
            if snapdata == nil {
                return
            }
            //snapdata!.keys : 階層
            //key : 階層
            for key in snapdata!.keys.sorted() {
                //snap : 階層下のデータを書くのすいた辞書
                //今回なら、snap = ["RoomName":"はわはわ"]
                let snap = snapdata![key]
                if let roomname = snap!["RoomName"] as? String {
                    self.roomArray.append(roomname)
                }
            }
        }
    }

 

 

【Swift】セルをタップ時、セルの色を自由に変更する

完成図

 

f:id:nekokichi_yos2:20181109140741p:plain

 

解説

 

 ・cell.selectionTypeに用意されたプロパティ(.none, .blue, .gray)を設定するだけ

・自分好みの色に設定するなら、

  1. UIViewを生成
  2. UIVIewの背景色を設定
  3. cell.selectedBackgroundViewにUIViewを代入

をするだけ

 

ソースコード

 

import UIKit

class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource {
    
    @IBOutlet weak var tableView: UITableView!
    
    //セルのテキストを格納
    var array = ["AAA","BBB","CCC"]
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //これを追加するだけ
        tableView.tableFooterView = UIView()
    }
    
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return array.count
    }
    
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath)
        
        //これでセルをタップ時、色は変化しなくなる
        cell.selectionStyle = UITableViewCell.SelectionStyle.none
        //自分で色を設定したい場合は、タップ時の色を指定したUIViewを代入
        let selectionView = UIView()
        //タップすると赤色になる
        selectionView.backgroundColor = UIColor.red
        cell.selectedBackgroundView = selectionView
        
        cell.textLabel?.text = array[indexPath.row]
        return cell
    }

}