2015-11-19 3 views
0

У меня есть пользовательские объекты (Сканирование) в массиве. Я хотел бы удалить конкретный объект, он не работает. Вот мой код:Удалить пользовательский объект в массиве

class Scan : NSObject, NSCoding { 

    let code : String 
    let title : String 
    let scanDate : NSDate 

    init(code: String, title: String, scanDate: NSDate) { 
     self.code = code 
     self.title = title 
     self.scanDate = scanDate 
    } 

    // MARK: NSCoding 

    required convenience init?(coder decoder: NSCoder) { 
     guard let code = decoder.decodeObjectForKey("code") as? String, 
      let title = decoder.decodeObjectForKey("title") as? String, 
      let scanDate = decoder.decodeObjectForKey("scanDate") as? NSDate 
      else { return nil } 

     self.init(code: code, title: title, scanDate: scanDate) 
    } 

    func encodeWithCoder(coder: NSCoder) { 
     coder.encodeObject(self.title, forKey: "title") 
     coder.encodeObject(self.code, forKey: "code") 
     coder.encodeObject(self.scanDate, forKey: "scanDate") 
    } 
} 

func == (lhs: Scan, rhs: Scan) -> Bool { 
    return lhs.code == rhs.code 
} 

А в другой класс:

func saveScan(scan: Scan){ 
     var allScans = scans() 
     allScans.append(scan) 
     NSKeyedArchiver.archiveRootObject(allScans, toFile: filePath) 

    } 

    func deleteScan(scan: Scan) { 
     var archivedScans = scans() 
     archivedScans.removeObject(scan) 
     NSKeyedArchiver.archiveRootObject(archivedScans, toFile: filePath) 
    } 

    func scans() -> [Scan] { 
     let scans = NSKeyedUnarchiver.unarchiveObjectWithFile(filePath) as? [Scan] ?? [Scan]() 
     return scans 
    } 

расширение массива:

extension Array where Element : Equatable { 

    mutating func removeObject(object : Generator.Element) { 
     if let index = self.indexOf(object) { 
      self.removeAtIndex(index) 
     } 
    } 
} 

archivedScans.removeObject(scan) не работает (archivedScans имеет те же элементы до и после removeObject). Вы видите, почему удаление не работает?

+0

Что? "Не работает" Вы видите ошибку? – JAL

+0

Массив имеет те же элементы до и после removeObject() – samir

+0

Что произойдет, если вы измените 'Generator.Element' на просто' Element' в расширении Array? Кроме того, уверены ли вы, что 'scan' находится в вашем массиве, прежде чем пытаться его удалить? – JAL

ответ

0

Равенство выполняется неправильно, потому что класс Scan является подклассом NSObject. Мы должны переопределять значение isEqual и hash Методы

Правильный код:

import Foundation 

class Scan : NSObject, NSCoding { 

    let code : String 
    let title : String 
    let scanDate : NSDate 

    init(code: String, title: String, scanDate: NSDate) { 
     self.code = code 
     self.title = title 
     self.scanDate = scanDate 
    } 

    // MARK: NSCoding 

    required convenience init?(coder decoder: NSCoder) { 
     guard let code = decoder.decodeObjectForKey("code") as? String, 
      let title = decoder.decodeObjectForKey("title") as? String, 
      let scanDate = decoder.decodeObjectForKey("scanDate") as? NSDate 
      else { return nil } 

     self.init(code: code, title: title, scanDate: scanDate) 
    } 

    func encodeWithCoder(coder: NSCoder) { 
     coder.encodeObject(self.title, forKey: "title") 
     coder.encodeObject(self.code, forKey: "code") 
     coder.encodeObject(self.scanDate, forKey: "scanDate") 
    } 

    override func isEqual(object: AnyObject?) -> Bool { 
     if let object = object as? Scan { 
      return self.code == object.code 
     } 
     return false 
    } 

    override var hash: Int { 
     return self.code.hashValue 
    } 
} 
Смежные вопросы