美文网首页从0到1学习iOS
iOS Swift 模型数组排序(仿写 sortedArrayU

iOS Swift 模型数组排序(仿写 sortedArrayU

作者: 一粒咸瓜子 | 来源:发表于2020-09-14 19:55 被阅读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;
    }
    

    相关文章

      网友评论

        本文标题:iOS Swift 模型数组排序(仿写 sortedArrayU

        本文链接:https://www.haomeiwen.com/subject/tgzzektx.html