2016-03-21 4 views
1

Я новичок в программировании , и у меня возникли проблемы с попыткой управлять данными в приложении iOS с использованием Realm с generics. Отделить модель MVC ясно я сделал три быстрых классов, как показано нижеИспользование Realm в 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, как показано ниже

ViewController

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'), чтобы ожидать аргумент типа «Объект»

Я знаю, что тип слева и справа не соответствует, но не может понять, как его исправить. (Значение aka для меня незнакомо, а googling это мне тоже не помогло)

Может ли кто-нибудь сказать мне, как я должен исправить этот код?

ответ

2

TaskModel.fetchData ожидает аргумент типа Object в этом случае, поскольку вы параметризировали класс таким, как тип T.

Вместо значения фактического экземпляра вы вводите значение типа TaskData.Type, которое является значением метатипа/класса.

Что вы хотите, так это то, что у fetchData нет аргумента вообще. Вы можете получить результаты, позвонив по номеру realm.objects(T.self).