2015-11-04 71 views
2

link告诉你你的排序函数看起来像什么,但我不能让一个Swift函数看起来像这样。在Swift中使用NSMutableArray sortUsingFunction?

这里是我的电话:

packetsArray.sortUsingFunction(comparePacketDates, context: nil) 

这里是我的功能,我已经尝试了无数的它的其他变化:

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

而且我一直在使用AC函数试图代替,这和一些其他的变化:

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

它总是“不能用参数列表调用......”说func重刑不是第一次争论的预期。

有没有人有Swift函数的示例代码将被接受为Swift sortUsingFunction的第一个参数?或者甚至是一个c函数,它将被接受为SortUsingFunction的第一个参数?

+0

我认为你的swift comparePacketDates函数的主体缺失。这可能有助于诊断问题。此外,您可能会考虑将NSMutableArray投射到Swift数组并使用Swift的排序机制。看到这里:http://stackoverflow.com/questions/25837539/how-can-i-cast-an-nsmutablearray-to-a-swift-array-of-a-specific-type – btmcnellis

+0

我的comparePacketDates的身体doesn'没关系,因为它没有那么远。它不会接受我将它声明为sortUsingFunction中第一个参数的方式。另外,如果我确实将它分类到Swift数组,Swift的排序工作可以用于一系列自定义对象吗?或者它只是排序字符串和数字的数组? –

回答

4

使用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 
} 
0

这是给你参考的例子,我写道:

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中。

+0

这不工作使用我有:XCode 6.4/Swift 1.2。相同的旧“不能调用”。也许是时候升级了。 –

+0

我会打赌你的解决方案在Swift 2.1中工作,但我暂时无法测试它,因为我将在2周内升级。我通常不喜欢“以不同的方式做出回答”,但抢夺市长的解决方案正在为我工​​作,所以我必须接受他的答案。 Thx很多。 –

+0

@JoeC不用担心:-) – Shripada