iOS Swift 模型数组排序(仿写 sortedArrayU
2020-09-14 本文已影响0人
一粒咸瓜子
目的:为了加深对 block 的理解
个人理解:block 的返回值 NSComparisonResult 略带有迷惑性,其实只会出现 0,1的取值,意思是 obj1与obj2的顺序是否与规定的不符
,改成 Bool 类型更容易理解。
- (NSArray *)sort:(NSComparisonResult(^)(id obj1, id obj2))cmptr {
NSUInteger length = self.count;
if (length < 2) {
return self;
}
NSMutableArray *arr = [self mutableCopy];
void(^swap)(int, int) = ^(int index1, int index2) {
id temp = arr[index1];
arr[index1] = arr[index2];
arr[index2] = temp;
};
//Bubble Sort
for (int i = 0; i < length -1; i++) {
for (int j = 0; j < length -1 -i; j++) {
BOOL correct = cmptr(arr[j], arr[j+1]);
if (!correct) {
swap(j, j+1);
} else
continue;
}
}
return arr.copy;
}
Swift 版:因 Swift array 中没有对模型数组进行排序的方法,就仿oc版的写了一个
/// model排序 (闭包中 obj as! model 即可使用属性)
/// 或 arr.sorted_oc (by: {($0 as! model).pid < ($1 as! model).pid})
/// - Parameter by: let model1 = obj1 as! model 即可使用属性
/// - Returns: [model]
func sorted_oc(by :(Any, Any) -> Bool) -> [Any] {
guard count > 1 else {
return self
}
var arr = self
//Bubble Sort
for i in 0..<count-1 {
for j in 0..<count-1-i {
let correct = by(arr[j], arr[j+1])
if !correct {
(arr[j], arr[j+1]) = (arr[j+1], arr[j])
} else {
continue
}
}
}
return arr
}
// 使用示范:
let persons = arr.sorted_oc (by: {($0 as! Person).pid < ($1 as! Person).pid})
// 或
let persons = array.sorted_oc { (a, b) -> Bool in
let obj1 = a as! Person
let obj2 = b as! Person
return obj1.pid < obj2.pid
}
为了便于对比理解,贴上直接规定排序顺序的方法:
缺点:只能接收纯数字数组
- (NSArray *)sortBy:(NSComparisonResult)order {
NSUInteger length = self.count;
if (length < 2 || order == NSOrderedSame) {
return self;
}
NSMutableArray *arr = [self mutableCopy];
void(^swap)(int, int) = ^(int index1, int index2) {
id temp = arr[index1];
arr[index1] = arr[index2];
arr[index2] = temp;
};
//Bubble Sort
for (int i = 0; i < length -1; i++) {
for (int j = 0; j < length -1 -i; j++) {
double a1 = [arr[j] doubleValue];
double a2 = [arr[j+1] doubleValue];
if (order == NSOrderedAscending && (a1 > a2)) {
swap(j, j+1);
} else if (order == NSOrderedDescending && (a1 < a2)) {
swap(j, j+1);
} else
continue;
}
}
return arr.copy;
}