在iOS中排序集

时间:2017-04-10 12:54:10

标签: swift

我有一套对象,让我们说Fruit:

let uniqueFruits = Set(Fruit("Apple"), Fruit("Banana"), Fruit("Orange"))

并希望根据某个atteribute对它们进行排序。在这种情况下" size"。

根据Apple的文档,我无法找到这样做的方法: https://developer.apple.com/reference/foundation/nsmutableset

如何按特定属性对Set进行排序?

2 个答案:

答案 0 :(得分:2)

您必须将Set转换为数组。

原因如下:

  

“集合在顺序无关紧要的意义上是不同的   将用于订单无关紧要的情况。“

而一组:

  

“...在集合中存储相同类型的不同值,但没有   定义了排序。“

有关详情,请参阅: https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/CollectionTypes.html

在这种情况下,你将有一个不同值的列表(我认为你决定使用NSSet作为有效参数)你必须将你的集转换为数组,你不应该遇到麻烦,因为你的集已经似乎要注意你的对象属于同一类型(例如“Fruit”)。

所以在这种情况下,我们会有

  1. 定义排序标准
  2. 对数组进行排序
  3. 我已经为Objective-C和Swift附加了一个示例,以防您需要这样或那样:

    Objective-C代码

    NSMutableSet<Fruit> *uniqueFruits = [NSMutableSet new];
    [uniqueFruits addObject:[[Fruit alloc] initWithName:@"Apple"]];
    [uniqueFruits addObject:[[Fruit alloc] initWithName:@"Banana"]];
    [uniqueFruits addObject:[[Fruit alloc] initWithName:@"Orange"]];
    
    // 1 Define Sort Criteria
    NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"size" ascending:YES]; // Key is the NSString of a certain selector. If it is an attribute of another class reference. Simply use "reference.property".
    
    // 2 Sort the Array
    NSArray<Fruit> *sortedArray = [self.uniqueFruits sortedArrayUsingDescriptors:@[descriptor]];
    

    Swift 3 Code

    let uniqueFruits = Set<Fruit>(Fruit("Apple"), Fruit("Banana"), Fruit("Orange"))
    
    // 1 & 2 Define Sort Criteria and sort the array, using a trailing closure that sorts on a field/particular property you specify
    // Be aware: result is an array
    let sortedArray = uniqueFruits.sort({ $0.size < $1.size })
    

答案 1 :(得分:-1)

NSOrderedSet及其可变的同级兄弟NSMutableOrderedSet,它们的确切含义是:保持顺序的集合。可变命令也有各种方法对集合进行排序。在Swift中,使用起来有点尴尬,因为您无法创建NSMutableOrderedSet<Fruit>,并且无论如何只能将其用于对象。