복붙노트

[SWIFT] 하나에 다른 유형의 정렬 두 배열

SWIFT

하나에 다른 유형의 정렬 두 배열

해결법


  1. 1.당신과 같이이 작업을 수행 할 수 있습니다

    당신과 같이이 작업을 수행 할 수 있습니다

    class TypeA {
        var ID: Int
    
        init(_ id: Int) {
            self.ID = id
        }
    }
    
    class TypeB {
        var ID: Int
    
        init(_ id: Int) {
            self.ID = id
        }
    }
    
    struct Wrap {
        var ID: Int {
            return a?.ID ?? b?.ID ?? 0
        }
        let a: TypeA?
        let b: TypeB?
    }
    
    var arrayA = [TypeA(1), TypeA(3), TypeA(5)]
    var arrayB = [TypeB(2), TypeB(4)]
    
    let sortedArray = (arrayA.map { Wrap(a: $0, b: nil) } + arrayB.map { Wrap(a: nil, b: $0)})
                          .sorted { $0.ID < $1.ID }
    

    행을 선택하면 당신은 객체를 함께 확인할 수 있습니다 :

    if let a = sortedArray[index].a {
        // TypeA row selected
    } else if let b = sortedArray[index].b {
        // TypeB row selected
    }
    

  2. 2.프로토콜, 빌드 및 그 공통 프로토콜 종류의 배열로 모든 일반 속성을 넣어 :

    프로토콜, 빌드 및 그 공통 프로토콜 종류의 배열로 모든 일반 속성을 넣어 :

    protocol HasID {
        var id: Int { get }
    }
    
    class TypeA : HasID, CustomStringConvertible {
        var id: Int
    
        init(_ id: Int) {
            self.id = id
        }
    
        var description : String {
            return ("TypeA(\(self.id))")
        }
    }
    
    class TypeB : HasID, CustomStringConvertible {
        var id: Int
    
        init(_ id: Int) {
            self.id = id
        }
    
        var description : String {
            return ("TypeB(\(self.id))")
        }
    }
    
    let typeA = [TypeA(1), TypeA(2), TypeA(5), TypeA(6)]
    let typeB = [TypeB(3), TypeB(4), TypeB(7)]
    let result: [HasID] = (typeA + typeB).sorted { $0.id < $1.id }
    
    print(result)
    

  3. 3.또는 당신은 당신이 당신의 뷰 컨트롤러에서 이러한 클래스에 확장을 정의 할 수 있습니다 HasID 프로토콜을 부담 TYPEA와 b를 입력 클래스하지 않으려면 조프 디노 대답 :

    또는 당신은 당신이 당신의 뷰 컨트롤러에서 이러한 클래스에 확장을 정의 할 수 있습니다 HasID 프로토콜을 부담 TYPEA와 b를 입력 클래스하지 않으려면 조프 디노 대답 :

    class TypeA {
        var ID: Int
    
        init(_ id: Int) {
            self.ID = id
        }
    }
    
    class TypeB {
        var ID: Int
    
        init(_ id: Int) {
            self.ID = id
        }
    }
    
    protocol HasID {
        var ID: Int { get }
    }
    
    // place this in your view controller
    
    extension TypeA: HasID {
    }
    
    extension TypeB: HasID {
    }
    
    var arrayA = [TypeA(1), TypeA(3), TypeA(5)]
    var arrayB = [TypeB(2), TypeB(4)]
    
    let sortedArray = (arrayA.map { $0 as HasID } + arrayB.map { $0 as HasID })
                          .sort { $0.ID < $1.ID }
    
  4. from https://stackoverflow.com/questions/32975491/sort-two-arrays-of-different-types-into-one by cc-by-sa and MIT license