続いてレイアウトの作成していきます。
配置したUIパーツと役割の説明
・TextView → リアルタイム更新のチャットのメッセージ表示
・TextField → 送信者の名前入力
・TextField → 送信者のメッセージの入力
・Button → ボタンタップでメッセージの送信

レイアウトが完成したら右クリックドラッグアンドドロップでOutletとActionをコードに追加します。

TextViewとTextFieldにはOutlet、ButtonにはActionを設定します。
設定が終わったらFirebaseを使うためのコードを書いていきます。
ViewControllerファイルでFirebaseDatabaseをimportします。
import FirebaseDatabase
ルートの指定をします。スクリーンショットの赤色の部分がルートだそうです。

var databaseRef: DatabaseReference!
override func viewDidLoad() {
        super.viewDidLoad()
        //ルートの指定
        databaseRef = Database.database().reference()
    }
これでデータベースにアクセスできるようになりました。
ここからは実際にデータベースを追加してみます。
送信ボタンのAction内で送信者の名前とメッセージの内容を送信しています。
        //TextFieldに入力したテキストをセット
        let messageInfo = ["name": nameTextField.text, "message": messageTextField.text]
        //ルート→chat_room→AutoID(自動でID生成)の下に名前とメッセージデータを書き込み
        self.databaseRef.child("chat_room").child(roomID).childByAutoId().setValue(messageInfo)
新しいデータが追加されたらチャット欄に反映する処理を作成します。
observeはデータの監視、.childAddedの部分は監視する条件の指定(データが追加されたとき)、snapshotは追加データを表します。
func observeChatMessage(databaseRef: DatabaseReference) {
        //snapshotが追加データを表します
        databaseRef.child("chat_room").child(roomID).observe(.childAdded) { snapshot in
            //データのnilチェック、データが存在する場合key:valueの形で受け取ります
            if let value = snapshot.value as? [String: Any] {
                //名前とメッセージを指定したkeyで受け取ります。ない場合は空文字""としています。
                let name = value["name"] as? String ?? ""
                let message = value["message"] as? String ?? ""
                //チャットのメッセージ表示用のTextViewにテキストを追加します。
                self.realTimeChatTextView.text = self.realTimeChatTextView.text + "\n\(name):\(message)"
            }
            
        }
    }
全体のコード
import UIKit
import FirebaseDatabase
class ViewController: UIViewController, UITextFieldDelegate {
    
    var databaseRef: DatabaseReference!
    //チャットルームのID 固定値としました
    let roomID = "room1"
    
    @IBOutlet weak var realTimeChatTextView: UITextView!
    
    @IBOutlet weak var nameTextField: UITextField!
    
    @IBOutlet weak var messageTextField: UITextField!
    
    @IBAction func sendButtonAction(_ sender: Any) {
        //TextFieldに入力したテキストをセット
        let messageInfo = ["name": nameTextField.text, "message": messageTextField.text]
        //ルート→chat_room→AutoID(自動でID生成)の下に名前とメッセージデータを書き込み
        self.databaseRef.child("chat_room").child(roomID).childByAutoId().setValue(messageInfo)
        
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        nameTextField.delegate = self
        messageTextField.delegate = self
        
        //ルート
        databaseRef = Database.database().reference()
        //初回データセット+追加データの監視
        observeChatMessage(databaseRef: databaseRef)
    }
    
    func textFieldShouldReturn(_ textField: UITextField) -> Bool{
            // キーボードを閉じる
            textField.resignFirstResponder()
            return true
    }
    
    func observeChatMessage(databaseRef: DatabaseReference) {
        //snapshotが追加データを表します
        databaseRef.child("chat_room").child(roomID).observe(.childAdded) { snapshot in
            //データのnilチェック、データが存在する場合key:valueの形で受け取ります
            if let value = snapshot.value as? [String: Any] {
                //名前とメッセージを指定したkeyで受け取ります。ない場合は空文字""としています。
                let name = value["name"] as? String ?? ""
                let message = value["message"] as? String ?? ""
                //チャットのメッセージ表示用のTextViewにテキストを追加します。
                self.realTimeChatTextView.text = self.realTimeChatTextView.text + "\n\(name):\(message)"
            }
            
        }
    }
}