Swift 2 - 如果值在当前日期之前,则删除数组中的 NSDate 值

Posted

技术标签:

【中文标题】Swift 2 - 如果值在当前日期之前,则删除数组中的 NSDate 值【英文标题】:Swift 2 - remove NSDate values in array if value is before current date 【发布时间】:2015-12-25 16:07:37 【问题描述】:

在我的应用程序中,我创建了一个“NSDate”数组以发送本地通知。 保存的值是“UUID”和“deadline”,它们使用let gameDictionary = NSUserDefaults.standardUserDefaults().dictionaryForKey(GAME_INFO) ?? [:]保存

结果有点类似这样:

[
    UUID = "546C5E4D-CFEE-42F3-9010-9936753D17D85";
    deadline = "2015-12-25 15:44:26 +0000";
, 
    UUID = "7C030614-C93C-4EB9-AD0A-93096848FDC7A";
    deadline = "2015-12-25 15:43:15 +0000";
]

我想要实现的是将“截止日期”值与当前日期进行比较,如果截止日期早于当前日期,则需要从数组中删除值。

func compareDeadline()  

        let gameDictionary = NSUserDefaults.standardUserDefaults().dictionaryForKey(GAME_INFO) ?? [:]
        var items = Array(gameDictionary.values)

        for i in 0..<items.count 

            let dateNotification = items[i]["deadline"]!! as! NSDate

            print(dateNotification)

            var isOverdue: Bool 
                return (NSDate().compare(dateNotification) == NSComparisonResult.OrderedDescending) // deadline is earlier than current date
            

            print(isOverdue)

            if (isOverdue == true)
                items.removeAtIndex(i)
            

        
    

当我尝试从数组中删除值时,我得到Fatal Error: Array index out of range

任何想法我该如何解决这个问题?

【问题讨论】:

因为悲哀。但是你的代码有更多的麻烦。您根据某些值创建一个数组,而不是尝试删除其中一些值,而不是...而不是您根本不使用结果。所以,很难说,你想做什么,但你需要先重新设计基本思想。你想更新 gameDictionary.values 吗? 是的,这就是我想要做的事情 尝试使用items = items.filter() $0 as! NSDate != dateNotification,但仍然失败 过滤值很容易。首先你需要从你的字符串中创建 NSDate,你不能简单地将字符串转换为 NSDate。 【参考方案1】:

您应该对数组使用 .filter 方法来删​​除该数组中不需要的任何内容。结果是一个仅包含过滤结果的新数组。

.filter 要求您在发送给它的闭包中设置过滤条件

Here is a good article on how to use it

【讨论】:

func 过滤器不会修改你调用它的数组。从此函数返回的结果可以分配给 var 为可变的或 let 为不可变的,由您决定。【参考方案2】:

可以使用filter的swift数组方法

例如过滤数组中的偶数:

func isEven(number: Int) -> Bool 
  return number % 2 == 0


evens = Array(1...10).filter(isEven)
println(evens)

【讨论】:

【参考方案3】:

有几个问题。您收到错误的原因是您在 for-in 块内迭代时无法删除元素。您可以使用以下代码过滤项目:

func compareDeadline()  
  let gameDictionary = NSUserDefaults.standardUserDefaults().dictionaryForKey(GAME_INFO) ?? [:]
  let items = Array(gameDictionary.values)
  let currentDate = NSDate()
  let dateFormatter = NSDateFormatter()
  dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ssZ"

  let filteredItems = items.flatMap(
      guard let stringDeadline = $0["deadline"] as? String, let deadline = dateFormatter.dateFromString(stringDeadline) else 
        return nil
      

      return deadline
  ).filter(
      currentDate.compare($0) == .OrderedDescending
  )

【讨论】:

你认为 $0["deadline'] 可以转换为 NSDate 吗? 我听从了你的建议,因为你没有发布数组的保存位置。如果日期真的是一个字符串,那么你需要用 NSDateFormatter 解析它 这不是我的问题,只是给你的笔记。如果你在问题下方查看我的笔记,你会发现那里还有很多其他问题 我在答案中添加了适当的日期格式化程序。

以上是关于Swift 2 - 如果值在当前日期之前,则删除数组中的 NSDate 值的主要内容,如果未能解决你的问题,请参考以下文章

如果列的值在 Oracle sql 中的格式不同,则使用特定格式更新日期

如果列值在一定范围内彼此接近,则删除 pandas 行

如何根据一定的逻辑创建一个检索年份的函数

如果上一行为空,则自动填充当前日期

mysql 如何获取数据表中离当前日期最近的数据

如果相同的列值在多行中重复,则 UPDATE - SQL / MYSQL