Вызов функции с различной структурой - PullRequest
0 голосов
/ 25 ноября 2018

Я хочу создать один func, который я могу использовать с различными struct.

У меня есть несколько struct, и я хочу использовать один func со всеми моими struct.

Я работаю с Firestore и хочу использовать этот func для доступа к Firestore.

Моя первая структура:

struct Profile {
    var name = ""
    var surname = ""
    var email = ""

    var dictionary: [String: Any] {
        return [
            "name": name,
            "surname": surname,
            "email": email
        ]
    }
}

extension Profile: DocumentSerializable {
    init?(dictionary: [String: Any], id: String) {
        let name = dictionary["name"] as? String ?? ""
        let surname = dictionary["surname"] as? String ?? ""
        let email = dictionary["email"] as? String ?? ""

        self.init(name: name,
                  surname: surname,
                  email: email)
    }
}

Моя вторая структура:

struct FavoriteList {
    var favoriteList: [String]
    var id: String

    var dictionary: [String: Any] {
        return [
            "favoriteList": favoriteList,
            "id": id
        ]
    }
}

extension FavoriteList: DocumentSerializable {
    init?(dictionary: [String : Any], id: String) {
        let favoriteList = dictionary["favorite"] as? [String] ?? [""]
        let id = id

        self.init(favoriteList: favoriteList, id: id)
    }
}

И мой функционал, который я использовал сейчас для загрузки данных из хранилища:

func observeQuery() {
    guard let query = query else { return }

    let time = DispatchTime.now() + 0.5 

    listener = query.addSnapshotListener { [unowned self] (snapshot, error) in
        if let snapshot = snapshot {
            DispatchQueue.main.asyncAfter(deadline: time) {
                let profileModels = snapshot.documents.map { (document) -> Profile in
                    if let profileModel = Profile(dictionary: document.data(), id: document.documentID) {
                        return profileModel
                    } else {
                        fatalError("Error!")
                    }
                }

                self.profile = profileModels
                self.document = snapshot.documents
                self.tableView.reloadData()
            }
        }
    }
}

Так, как я могу сделать func observeQuery, чтобы использовать мои структуры Profile или FavouriteList?

1 Ответ

0 голосов
/ 25 ноября 2018

Вы можете использовать общие функции:

func observeQuery<T>(someObject: T) {
    if someObject is Profile {
        //do something
    } else if someObject is FavouriteList {
        //do something
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...