【问题标题】:Using NSMutableArray sortUsingFunction in Swift?在 Swift 中使用 NSMutableArray sortUsingFunction?
【发布时间】:2015-11-04 03:03:40
【问题描述】:

link 告诉您排序函数的外观,但我无法让 Swift 函数看起来像那样。

这是我的电话:

packetsArray.sortUsingFunction(comparePacketDates, context: nil)

这是我的函数,我已经尝试了无数其他变体:

static func comparePacketDates(packet1 : AnyObject, packet2: AnyObject, context: UnsafeMutablePointer<Void>) -> Int {

我已经尝试使用 c 函数,这个和其他一些变体:

NSInteger comparePacketDates(id packet1, id packet2, void* dummy);

它总是“不能用参数列表调用......”说函数不是预期的第一个参数。

有没有人有可以作为 Swift sortUsingFunction 的第一个参数接受的 Swift 函数的示例代码?甚至是一个可以作为 Swift SortUsingFunction 的第一个参数接受的 c 函数?

【问题讨论】:

  • 我认为您的 swift comparePacketDates 函数的主体丢失了。这可能有助于诊断问题。此外,您可以考虑将 NSMutableArray 转换为 Swift 数组并使用 Swift 的排序机制。见这里:stackoverflow.com/questions/25837539/…
  • comparePacketDates 的主体无关紧要,因为它没有走那么远。它不会接受我在 sortUsingFunction 中将其声明为第一个参数的方式。此外,如果我确实将它转换为 Swift 数组,Swift 的排序是否适用于自定义对象数组?还是只是对字符串和数字数组进行排序?

标签: swift nsmutablearray


【解决方案1】:

使用sortUsingComparator。它比sortUsingFunction 更简单。语法如下:

a.sortUsingComparator {
    let packet1 = $0 as! Packet
    let packet2 = $1 as! Packet
    if packet1.timestamp < packet2.timestamp {
        return .OrderedAscending
    }
    if packet1.timestamp == packet2.timestamp {
        return .OrderedSame
    }
    return .OrderedDescending
}

【讨论】:

    【解决方案2】:

    这是我写的一个示例供您参考:

    var ma = NSMutableArray()
    
    ma.addObject("Hi")
    ma.addObject("Anil")
    
    func comp(first: AnyObject, second:AnyObject,  context: UnsafeMutablePointer<Void>) -> Int {
      let f:String  = first as! String
      let s:String = second as! String
    
      if f > s {
        return 1
      }
      else if ( f == s ) {
        return 0
      }
    
      return -1
    
    }
    
    ma.sortUsingFunction(comp, context:UnsafeMutablePointer<Void>(bitPattern: 0))
    

    HTH,作为你的参考。注意:我在 Xcode 7.1 Swift 2.1 中。

    【讨论】:

    • 这没有使用我所拥有的:XCode 6.4 / Swift 1.2。相同的旧“无法调用”。也许是时候升级了。
    • 我敢打赌您的解决方案在 Swift 2.1 中有效,但我暂时无法对其进行测试,因为我将在 2 周内升级。我通常不喜欢“以不同的方式做”的答案,但抢劫市长的解决方案对我有用,所以我必须接受他的回答。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-03
    • 1970-01-01
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多