在Swift中,如何检测编码的自定义类数组中的重复项?

时间:2016-03-22 19:41:46

标签: ios arrays swift encoding nsuserdefaults

我有一个数组,用于存储已编码的自定义类,以便将其保存到NSUserDefaults。它基于tableView单元格,带有收藏夹按钮,每次按下收藏夹按钮,保存到本地阵列,然后保存到NSUserDefaults。问题是如果多次按下收藏夹按钮,该tableView单元格的多个副本将保存到NSUserDefaults。这是我保存数据的代码。我试着检查一下" savedFavorite"已经存在于数组中,但由于它每次都被编码为不同的编码值,所以它看起来不像重复:

 let myDefaults = NSUserDefaults.standardUserDefaults()
  let savedShow1 = "savedShow1"
  var savedFavorite: TvShowInfo!
  var savedFavoriteArray:[TvShowInfo] = []

  @IBAction func saveShow(sender: UIButton) {

    //accessing current point of tableView Cell
    let location: CGPoint = sender.convertPoint(CGPointZero, toView: self.tvShowTableView)
    let indexPath: NSIndexPath = self.tvShowTableView.indexPathForRowAtPoint(location)!
    let searchTermsData = myDefaults.objectForKey(savedShow1) as? NSData

    //accessing previously saved info so as not to overwrite it
    if searchTermsData?.length > 0 {
    let searchTermsArray = NSKeyedUnarchiver.unarchiveObjectWithData(searchTermsData!) as? [TvShowInfo]

    self.savedFavoriteArray = searchTermsArray!
    }

    if searchBarActive {
      savedFavorite = filteredShowSearchResults[indexPath.row]
    } else {
      savedFavorite = showArray[indexPath.row]
    }

      if savedFavoriteArray.contains(savedFavorite) {
        print("Item already in array")
      } else {
        savedFavoriteArray.append(savedFavorite)
   }

    let savedData = NSKeyedArchiver.archivedDataWithRootObject(savedFavoriteArray)
    myDefaults.setObject(savedData, forKey: savedShow1)
    myDefaults.synchronize()
  } 

这是我的自定义类:

class TvShowInfo: NSObject, NSCoding {

  var poster: String
  var title: String
  var id: NSNumber

 init(poster: String, title: String, id: NSNumber) {

    self.poster = poster
    self.title = title
    self.id = id

  }

  // MARK: - comply wiht NSCoding protocol

  func encodeWithCoder(aCoder: NSCoder) {
    aCoder.encodeObject(poster, forKey: "poster")
    aCoder.encodeObject(title, forKey: "title")
    aCoder.encodeObject(id, forKey: "id")
  }

  required convenience init?(coder aDecoder: NSCoder) {

    // decoding could fail, for example when no Blog was saved before calling decode
    guard let unarchivedPoster = aDecoder.decodeObjectForKey("poster") as? String,
          let unarchivedTitle =  aDecoder.decodeObjectForKey("title") as? String,
          let unarchivedId = aDecoder.decodeObjectForKey("id") as? NSNumber

    else {
        // option 1 : return an default Blog
      self.init(poster: "unkown", title:"unkown", id: 0)
      return
    }

    // convenience init must call the designated init
    self.init(poster: unarchivedPoster, title: unarchivedTitle, id: unarchivedId)
  }
}

1 个答案:

答案 0 :(得分:0)

您也可以将数组转换为set(NSSet),并且您的数组将立即免于重复。请参阅此帖子:Set operations (union, intersection) on Swift array?