как сделать операцию CRUD царства в отдельном файле swift? - PullRequest
0 голосов
/ 10 мая 2018

Я новичок в разработке для iOS и в программировании, я пытаюсь создать быстрый файл, содержащий операцию CRUD для области, называемую RealmService, поэтому мне не нужно писать do catch block и try! царство повсюду, как мой код ниже

import Foundation
import RealmSwift

class RealmService {

    var realm = try! Realm()

    func save(_ object: Object) {
        do {
            try realm.write {
                realm.add(object)
            }
        } catch {
            print("Failed to save \(object) in realm: \(error.localizedDescription)")
        }
    }

    func load(_ object: Object) -> Results<Object>? {
        return realm.objects(object.self)
    }

    func update(_ object: Object, with dictionary: [String: Any?]) {
        do {
            try realm.write {
                for (key, value) in dictionary {
                    object.setValue(value, forKey: key)
                }
            }
        } catch {
            print("Failed to update \(object) in realm: \(error.localizedDescription)")
        }
    }

    func delete(_ object: Object) {
        do {
            try realm.write {
                realm.delete(object)
            }
        } catch {
            print("Failed to delete \(object) in realm: \(error.localizedDescription)")
        }
    }
}

но в методе load я получаю сообщение об ошибке в строке realm.objects(object.self), говорится

Невозможно преобразовать значение типа «Объект» в ожидаемый тип аргумента. 'Object.Type'

enter image description here

Я думаю, что я делаю ошибку, когда вставляю object.self в realm.objects. это должен быть element.type, но я понятия не имею, что это за тип элемента, как эта картинка enter image description here

как загрузить данные из области? к сожалению, я просто знаю немного из учебника YouTube с помощью realm.objects(object.self)

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Я использую ReamManager с CRUD следующим образом:

import UIKit
import RealmSwift

class RealmManager {

    private let NotificationError = Notification.Name.Realm.realmErrorNotification

    var realm = try! Realm()

    func create<T: Object>(_ object: T) {
        do {
            try realm.write {
                realm.add(object, update: true)
            }
        } catch {
            post(error)
        }
    }

    func create<T: Object>(_ objects: [T]) {
        do {
            try realm.write {
                realm.add(objects, update: true)
            }
        } catch {
            post(error)
        }
    }

    func read<T: Object>(_ object: T.Type) -> Results<T> {
        let result = realm.objects(object.self)
        return result
    }

    func update<T: Object>(_ object: T, with dictionary: [String: Any]) {
        do {
            try realm.write {
                for (key, value) in dictionary {
                    object.setValue(value, forKey: key)
                }
            }
        } catch {
            post(error)
        }
    }

    func delete<T: Object>(_ object: T) {
        do {
            try realm.write {
                realm.delete(object)
            }
        } catch {
            post(error)
        }
    }

    func post(_ error: Error) {
        NotificationCenter.default.post(name: NotificationError, object: error)
    }

    func observeRealErrors(in viewController: UIViewController, complation: @escaping (Error?) -> Void) {
        NotificationCenter.default.addObserver(forName: NotificationError, object: viewController, queue: nil) { (notification) in
            complation(notification.object as? Error)
        }
    }

    func stopObserveRealErrors(in viewController: UIViewController) {
        NotificationCenter.default.removeObserver(viewController, name: NotificationError, object: nil)
    }
}

может быть, это именно то, что вы хотели

0 голосов
/ 10 мая 2018

Вы выполняете операцию выбора через объект, и это ошибка, поскольку требуется тип объекта Element.Type, а не сам объект

попробуйте использовать это

 func load<T: Object>(ofType: T.Type) -> Results<T> {

            return realm.objects(T.self)

    }

назовите это func

class MyObject: Object {
     ...
    @objc dynamic var name = ""
    ...

   }
  .....
  ream.objects(MyObject.self)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...