从0到1学习iOS

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;
}
上一篇 下一篇

猜你喜欢

热点阅读