【问题标题】:Using Realm in Swift with generics在 Swift 中使用 Realm 和泛型
【发布时间】:2016-07-07 09:38:02
【问题描述】:

我是编程新手 并且在尝试管理 iOS 应用程序中的数据时遇到问题 将 Realm 与泛型一起使用。 为了清楚地分离 MVC 模型,我制作了三个 swift 类,如下所示

ModelLocator.swift

import UIKit
import RealmSwift

class ModelLocator : NSObject {

    class var sharedInstance : ModelLocator {
        struct Singleton {
            static var instance = ModelLocator()
        }
        return Singleton.instance
    }

    var tasks = TaskModel<Object>()

    override init() {
        print("ModelLocator init!")
    }

    func getTask() -> TaskModel<Object> {
        return tasks
    }

    func setTask(array:TaskModel<Object>) -> TaskModel<Object> {
        tasks = array
        return tasks
    }

}

ModelData.swift

import UIKit
import RealmSwift

let realm = try! Realm()

class TaskModel <T: Object>: NSObject {

    var resources : Results<T>!

    func getResources() -> Results<T> {
        return resources
    }

    func fetchData(database: T) {
        self.resources = try! Realm().objects(database.dynamicType).sorted("date", ascending: false)
    }

    func saveTaskData(number : Int, item : T ){
        let taskData:TaskData = TaskData()
        try! realm.write {
            switch number {
            case 0:
                taskData.id = item as! Int
                break
            case 1:
                taskData.title = item as! String
                break
            default:
                break
            }
        }
    }

}

TaskData.swift

import RealmSwift

class TaskData: Object {

    dynamic var id = 0    
    dynamic var title = ""
    dynamic var category: Category?
    // category.id:Int, category.name:String, category.priority:Int
    dynamic var contents = "" 
    dynamic var date = NSDate()

    /* set id as primary */
    override static func primaryKey() -> String {
        return "id"
    }

}

并在 ViewController.swift 中调用它,如下所示

视图控制器

import UIKit
import RealmSwift

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var tbView: UITableView!

    var taskModel: TaskModel<Object> = TaskModel()
    var taskArray: Results<TaskData>?
    var category: Category = Category()

    override func viewDidLoad() {
        super.viewDidLoad()

        let modelLocator = ModelLocator()
        taskModel = modelLocator.getTask()
        let database = "TaskData"
        taskArray = taskModel.fetchData(TaskData) // <- Where there is error in line  
        print(taskArray)

在构建时,上面的行显示错误提示

“无法将类型'(TaskData).Type'(又名'TaskData.Type')的值转换为预期的参数类型'Object'”

我知道left和right的类型不匹配,但不知道如何更正。 (也就是我不熟悉的意思,谷歌搜索也没有帮助)

谁能告诉我应该如何修复这段代码?

【问题讨论】:

    标签: swift model realm xcode7.2


    【解决方案1】:

    TaskModel.fetchData 在这种情况下需要Object 类型的参数,因为您将类参数化为T 类型。

    您传入的是 TaskData.Type 类型的值,它是元类型/类值,而不是实际实例。

    您想要的是 fetchData 根本没有参数。您可以通过调用realm.objects(T.self) 来获取结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-20
      • 1970-01-01
      相关资源
      最近更新 更多