2014-12-25 3 views
0

Я хочу сортировать массив с именами пользователей, которые я извлекаю из своих основных данных. Я получить его, как это:Swift - Сортировка массива, полученного из данных ядра

override func viewDidAppear(animated: Bool) { 

    let appDel:AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate 
    let context:NSManagedObjectContext = appDel.managedObjectContext! 
    let freq = NSFetchRequest(entityName: "User") 
    let en = NSEntityDescription.entityForName("User", inManagedObjectContext: context) 

    myList = context.executeFetchRequest(freq, error: nil)! 

    tv.reloadData() 

} 

А позже я поставил клетки в моем Tableview так:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    let CellID:NSString = "cell" 
    var cell: UITableViewCell = self.tv.dequeueReusableCellWithIdentifier(CellID) as UITableViewCell 
    if let ip = indexPath as Optional { 

     var data:NSManagedObject = myList[ip.row] as NSManagedObject 

     cell.textLabel!.text = data.valueForKeyPath("username") as String! 

    } 

Я пытался использовать функцию сортировки для в функции viewDidAppear так:

var sortedList = myList.sorted { $0.localizedCaseInsensitiveCompare($1) == NSComparisonResult.OrderedAscending } 

Но это дает мне ошибку говоря: «не удалось найти член" localizedCaseInsensitiveCompare»

Любые предложения о том, как действовать, будут оценены.

+0

Почему бы не просто добавить sortDescriptor в запрос на выборку? – Abizern

ответ

2

executeFetchRequest возвращается [AnyObject]? и вам нужно преобразовать это как [NSManagedObjet] массив и сортировать по user ключ

if let myList = myList as? [NSManagedObject] { 
    var sortedList = myList.sorted { ($0.valueForKeyPath("user") as String).localizedCaseInsensitiveCompare(($1.valueForKeyPath("user") as String)) == NSComparisonResult.OrderedAscending } 
} 
else { 

    println("My List not contains the NSManagedObject array") 
} 
+0

Это дает мне ошибку: «фатальная ошибка: массив не может быть соединен с Objective-C lldb» – martin

+0

какая ошибка ?? ваш myList должен иметь только массив 'Strings', а не пользовательский массив или словарь. Пожалуйста, проверьте, что – codester

+1

myList - это массив NSManagedObjects, то есть myList = context.executeFetchRequest (freq, error: no)! –

2

Я хотел бы использовать отдельную функцию для извлечения и сортировки массива. Вы сортируете массив, используя NSSortDescriptor. Вы можете добавить проверку капитализации в качестве селектора дескриптора сортировки. Я получил отдельную функцию от this tutorial. Я использовал его, и он работает для меня. Я получил идею для идеи селектора, ссылаясь на this Objective-C code.

var objectives: [NSManagedObject]! 
func fetchUsernames() { 

    static let appDel: AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate 
    let context: NSManagedObjectContext = appDel.managedObjectContext! 

    let freq = NSFetchRequest(entityName: "User") 
    let sortDescriptor = NSSortDescriptor(key: "username", ascending: true, selector: "localizedCaseInsensitiveCompare:") 
    freq.sortDescriptors = [sortDescriptor] 

    do { 
     let fetchedResults: [NSManagedObject] = try managedContext.executeFetchRequest(freq) as! [NSManagedObject] 
     if let results: [NSManagedObject] = fetchedResults { 
      objectives = results 
     } 
    } catch let error as NSError { 
     print("Error: \(error.localizedDescription)") 
    } 
    tableView.reloadData() 
}