【问题标题】:NSSortDescriptor evaluating ascending numbers (Swift)NSSortDescriptor 评估升序数字 (Swift)
【发布时间】:2015-05-13 12:58:11
【问题描述】:

应用程序有 contentid 来自 json 文件的数字字符串:

let contentid: AnyObject! = jsonFeed["contentid"]

let stream:Dictionary = [
   "contentId": contentid as! String,
]

稍后将其保存到 [NSManagedObject] 中:

var articles = [NSManagedObject]()

let entity =  NSEntityDescription.entityForName("Article", inManagedObjectContext: managedContext)
let article = NSManagedObject(entity: entity!, insertIntoManagedObjectContext: managedContext)

article.setValue(stream["contentId"], forKey: "contentid")

articles.append(article)

最后,我使用 NSSortDescriptor 让 Core Data 按数字升序返回条目:

let sort = NSSortDescriptor(key: "contentid", ascending: true)
fetchRequest.sortDescriptors = [sort]

但条目 6 - 10 返回为:10, 6, 7, 8, 9。使用 NSSortDescriptor 正确评估这些数字的正确方法是什么?

更新:

对于 Swift 版本,请参阅下面 Volker 的回答。我最终使用了:

let sort = NSSortDescriptor(key: "contentid", ascending: true, selector: "localizedStandardCompare:")

并将编号字符串评估为真正的整数。

更新:Swift 2:

选择器语法已更改,不再接受 objc 指针。谢谢user1828845。

let sort = NSSortDescriptor(key: "contentid", ascending: true, selector: #selector(NSString.localizedStandardCompare(_:)))

【问题讨论】:

  • contentid 内部是数字还是字符串?
  • @Volker 内部是一个字符串。
  • 描述符将这些视为数字。这就是为什么它在 6 之前显示 10。可能的解决方案是将这些数字视为 NSString。
  • 存在init(key:ascending:selector:),您可以使用selector: "localizedStandardCompare:",如此处所述,例如nshipster.com/nssortdescriptor
  • @Volker,效果很好。感谢您提供链接,因为到目前为止,您发现 Swift 代码引用是有限的。我去了:let sort = NSSortDescriptor(key: "contentid", ascending: true, selector: "localizedStandardCompare:")

标签: ios swift core-data nssortdescriptor


【解决方案1】:

就我而言,我尝试过

let descriptor: NSSortDescriptor = NSSortDescriptor(key: "formId", ascending: true, selector: #selector(NSString.localizedStandardCompare(_:))) 它对我有用。

【讨论】:

    【解决方案2】:

    您要排序的值实际上是字符串而不是数字,因此排序顺序很奇怪。对于 Swift,存在 init(key:ascending:selector:)NSSortDescriptor 的初始化程序,因此您可以使用 selector: "localizedStandardCompare:" 例如在 nshipster.com/nssortdescriptor 中描述的

    localizedStandardCompare: 为您提供了一个类似于对字符串值进行排序的 Finder,它可以像对数字进行排序一样自然地对数字进行排序。所以 1,...,9,10,...,99, 100 等等。

    【讨论】:

      【解决方案3】:
              let descriptor: NSSortDescriptor = NSSortDescriptor(key: "message_time", ascending: true)
              let sortedResults = arrayForMessages.sortedArray(using: [descriptor])
              print(sortedResults)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多