1

我是编程新手,在尝试使用带有泛型的 Realm 管理 iOS 应用程序中的数据时遇到了麻烦。为了清楚地分离 MVC 模型,我制作了三个 swift 类,如下所示

模型定位器.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
    }

}

模型数据.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
            }
        }
    }

}

任务数据.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'”

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

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

4

1 回答 1

2

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

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

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

于 2016-03-21T12:50:34.857 回答