iOS 日常排序

607 阅读1分钟

Objective-C

1. 自定义对象

@interface MyNumber : NSObject
@property (assign) int value;
@end

@implementation MyNumber
- (instancetype)initWithValue:(int)value
{
    self = [super init];
    if (self) {
        self.value = value;
    }
    return self;
}
@end

2. 让自定义对象可以比较大小

value 从小到大认为升序)

@implementation MyNumber (Compare)

- (NSComparisonResult)compare:(MyNumber *)other
{
    if (self.value > other.value) {
        return NSOrderedDescending;
    }
    else if (self.value < other.value) {
        return NSOrderedAscending; 
    }
    else {
        return NSOrderedSame;
    }
}

@end

3. 测试数据

MyNumber *num1 = [[MyNumber alloc] initWithValue:1];
MyNumber *num2 = [[MyNumber alloc] initWithValue:2];
MyNumber *num3 = [[MyNumber alloc] initWithValue:3];

NSArray *sourceArray = @[num2, num3, num1];

4. 用 Comparator 排序

降序则把 lhsrhs 颠倒位置

NSArray *sortedArray = [sourceArray sortedArrayUsingComparator:^ NSComparisonResult(MyNumber *lhs, MyNumber *rhs) {
    return [lhs compare:rhs]; 
}];

5. 用 Selector 排序

NSArray *sortedArray = [sourceArray sortedArrayUsingSelector:@selector(compare:)];

6. 用 Descriptor 排序

不依赖 compare 的方式

NSArray *sortedArray = [sourceArray sortedArrayUsingDescriptors:@[[[NSSortDescriptor alloc] initWithKey:@"value" ascending:YES]]];

依赖 compare 的方式

NSArray *sortedArray = [sourceArray sortedArrayUsingDescriptors:@[[[NSSortDescriptor alloc] initWithKey:@"value" ascending:YES selector:@selector(compare:)]]];

Swift

1. 自定义对象

struct MyNumber {
    var value: Int
}

2. 让自定义对象可以比较大小

extension MyNumber: Comparable {
    static func < (lhs: MyNumber, rhs: MyNumber) -> Bool {
        return lhs.value < rhs.value
    }
}

3. 测试数据

let num1 = MyNumber(value: 1)
let num2 = MyNumber(value: 2)
let num3 = MyNumber(value: 3)

let sourceArray = [num1, num2, num3]

4. 升序

let sortedArray = sourceArray.sorted()

5. 降序

let sortedArray = sourceArray.sorted(by: >)