Firebaseのドキュメントにも書いてある通りだが、ViewControllerにFirebaseをimportしない方法で記述する。
FirestoreContoroller.swift
import UIKit
class FirestoreViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func addAction(_ sender: Any) {
Database.addTest()
}
@IBAction func readAction(_ sender: Any) {
Database.readTest() { users in
for user in users {
print("\(user.first), \(user.last), \(user.born)")
}
}
}
}
UserModel.swift
import Foundation
import FirebaseAuth
struct UserModel: Codable {
private var _first: String?
var first: String { _first ?? "" }
private var _last: String?
var last: String { _last ?? "" }
private var _born: Int?
var born: Int { _born ?? 0 }
private var _weight: Double?
var weight: Double { _weight ?? 0 }
private var _height: String?
var height: String { _height ?? "" }
private let auth = Auth.auth()
var isEmailValidation: Bool {
auth.currentUser?.isEmailVerified ?? false
}
private enum CodingKeys: String, CodingKey {
case _first = "first"
case _last = "last"
case _born = "born"
}
}
Database.swift
import Foundation
import Firebase
import FirebaseFirestore
import FirebaseFirestoreSwift
class Database {
private static let db = Firestore.firestore()
static func addTest() {
var ref: DocumentReference? = nil
ref = db.collection("users").addDocument(data: [
"first": "Ada",
"last": "Lovelace",
"born": 1815
]) { err in
if let err = err {
print("Error adding document: \(err)")
} else {
print("Document added with ID: \(ref!.documentID)")
}
}
}
static func readTest(completion: (([UserModel]) -> Void)? = nil) {
let _completion: ((QuerySnapshot?, Error?) -> Void) = { (querySnapshot, err) in
var users: [UserModel] = []
if let err = err {
print("Error getting documents: \(err)")
completion?(users)
return
}
for document in querySnapshot!.documents {
if let _user = try? Firestore.Decoder().decode(UserModel.self, from: document.data()) {
users.append(_user)
}
}
completion?(users)
}
db.collection("users").getDocuments(completion: _completion) //全部終わるまで待つ
}
}