[arrays] 속성 값으로 사용자 정의 객체 배열을 정렬하는 방법

imageFile이라는 사용자 정의 클래스가 있고이 클래스에 두 가지 속성이 있다고 가정하겠습니다.

class imageFile  {
    var fileName = String()
    var fileID = Int()
}

배열에 많이 저장

var images : Array = []

var aImage = imageFile()
aImage.fileName = "image1.png"
aImage.fileID = 101
images.append(aImage)

aImage = imageFile()
aImage.fileName = "image1.png"
aImage.fileID = 202
images.append(aImage)

질문은 : 어떻게 ‘fileID’ASC 또는 DESC로 이미지 배열을 정렬 할 수 있습니까?



답변

먼저 배열을 유형이 지정된 배열로 선언하면 반복 할 때 메소드를 호출 할 수 있습니다.

var images : [imageFile] = []

그런 다음 간단하게 수행 할 수 있습니다.

스위프트 2

images.sorted({ $0.fileID > $1.fileID })

스위프트 3+

images.sorted(by: { $0.fileID > $1.fileID })

위의 예는 desc 정렬 순서를 제공합니다


답변

[ sort (by :)를 사용하여 Swift 3 용으로 업데이트 됨 ] 후행 클로저를 활용합니다.

images.sorted { $0.fileID < $1.fileID }

ASC 또는 DESC 각각에 따라 <또는 사용 >합니다. 배열 을 수정하려면images 다음을 사용하십시오.

images.sort { $0.fileID < $1.fileID }

이 작업을 반복적으로 수행하고 함수 정의를 선호하는 경우 한 가지 방법은 다음과 같습니다.

func sorterForFileIDASC(this:imageFile, that:imageFile) -> Bool {
  return this.fileID > that.fileID
}

다음으로 사용하십시오.

images.sort(by: sorterForFileIDASC)


답변

거의 모든 사람들이 어떻게 직접적으로 진화를 보여줄 수 있는지 알려줍니다.

Array의 인스턴스 메소드를 사용할 수 있습니다.

// general form of closure
images.sortInPlace({ (image1: imageFile, image2: imageFile) -> Bool in return image1.fileID > image2.fileID })

// types of closure's parameters and return value can be inferred by Swift, so they are omitted along with the return arrow (->)
images.sortInPlace({ image1, image2 in return image1.fileID > image2.fileID })

// Single-expression closures can implicitly return the result of their single expression by omitting the "return" keyword
images.sortInPlace({ image1, image2 in image1.fileID > image2.fileID })

// closure's argument list along with "in" keyword can be omitted, $0, $1, $2, and so on are used to refer the closure's first, second, third arguments and so on
images.sortInPlace({ $0.fileID > $1.fileID })

// the simplification of the closure is the same
images = images.sort({ (image1: imageFile, image2: imageFile) -> Bool in return image1.fileID > image2.fileID })
images = images.sort({ image1, image2 in return image1.fileID > image2.fileID })
images = images.sort({ image1, image2 in image1.fileID > image2.fileID })
images = images.sort({ $0.fileID > $1.fileID })

정렬의 작동 원리에 대한 자세한 설명은 정렬 함수를 참조하십시오 .


답변

스위프트 3

people = people.sorted(by: { $0.email > $1.email })


답변

Swift 5 Array에는 sorted()and 라는 두 가지 메소드가 sorted(by:)있습니다. 첫 번째 방법 sorted()은 다음과 같은 선언입니다.

컬렉션의 요소를 정렬하여 반환합니다.

func sorted() -> [Element]

두 번째 방법 sorted(by:)은 다음과 같은 선언입니다.

주어진 술어를 요소 간의 비교로 사용하여 정렬 된 콜렉션의 요소를 리턴합니다.

func sorted(by areInIncreasingOrder: (Element, Element) throws -> Bool) rethrows -> [Element]

#1. 비교 가능한 객체에 대해 오름차순으로 정렬

컬렉션 내의 요소 유형이 Comparable프로토콜을 따르는 경우 sorted()요소를 오름차순으로 정렬하는 데 사용할 수 있습니다 . 다음 놀이터 코드는 사용 방법을 보여줍니다 sorted().

class ImageFile: CustomStringConvertible, Comparable {

    let fileName: String
    let fileID: Int
    var description: String { return "ImageFile with ID: \(fileID)" }

    init(fileName: String, fileID: Int) {
        self.fileName = fileName
        self.fileID = fileID
    }

    static func ==(lhs: ImageFile, rhs: ImageFile) -> Bool {
        return lhs.fileID == rhs.fileID
    }

    static func <(lhs: ImageFile, rhs: ImageFile) -> Bool {
        return lhs.fileID < rhs.fileID
    }

}

let images = [
    ImageFile(fileName: "Car", fileID: 300),
    ImageFile(fileName: "Boat", fileID: 100),
    ImageFile(fileName: "Plane", fileID: 200)
]

let sortedImages = images.sorted()
print(sortedImages)

/*
 prints: [ImageFile with ID: 100, ImageFile with ID: 200, ImageFile with ID: 300]
 */

# 2. 비슷한 객체에 대해 내림차순으로 정렬

컬렉션 내의 요소 유형이 Comparable프로토콜을 따르는 경우 sorted(by:)요소를 내림차순으로 정렬하려면 사용해야 합니다.

class ImageFile: CustomStringConvertible, Comparable {

    let fileName: String
    let fileID: Int
    var description: String { return "ImageFile with ID: \(fileID)" }

    init(fileName: String, fileID: Int) {
        self.fileName = fileName
        self.fileID = fileID
    }

    static func ==(lhs: ImageFile, rhs: ImageFile) -> Bool {
        return lhs.fileID == rhs.fileID
    }

    static func <(lhs: ImageFile, rhs: ImageFile) -> Bool {
        return lhs.fileID < rhs.fileID
    }

}

let images = [
    ImageFile(fileName: "Car", fileID: 300),
    ImageFile(fileName: "Boat", fileID: 100),
    ImageFile(fileName: "Plane", fileID: 200)
]

let sortedImages = images.sorted(by: { (img0: ImageFile, img1: ImageFile) -> Bool in
    return img0 > img1
})
//let sortedImages = images.sorted(by: >) // also works
//let sortedImages = images.sorted { $0 > $1 } // also works
print(sortedImages)

/*
 prints: [ImageFile with ID: 300, ImageFile with ID: 200, ImageFile with ID: 100]
 */

#삼. 비교할 수없는 객체의 오름차순 또는 내림차순으로 정렬

컬렉션 내의 요소 유형이 Comparable프로토콜을 준수하지 않으면 sorted(by:)요소를 오름차순 또는 내림차순으로 정렬하기 위해 사용해야 합니다.

class ImageFile: CustomStringConvertible {

    let fileName: String
    let fileID: Int
    var description: String { return "ImageFile with ID: \(fileID)" }

    init(fileName: String, fileID: Int) {
        self.fileName = fileName
        self.fileID = fileID
    }

}

let images = [
    ImageFile(fileName: "Car", fileID: 300),
    ImageFile(fileName: "Boat", fileID: 100),
    ImageFile(fileName: "Plane", fileID: 200)
]

let sortedImages = images.sorted(by: { (img0: ImageFile, img1: ImageFile) -> Bool in
    return img0.fileID < img1.fileID
})
//let sortedImages = images.sorted { $0.fileID < $1.fileID } // also works
print(sortedImages)

/*
 prints: [ImageFile with ID: 300, ImageFile with ID: 200, ImageFile with ID: 100]
 */

스위프트는 또한라는 두 가지 방법을 제공합니다 sort()sort(by:)의 대응으로 sorted()하고 sorted(by:)경우에 당신이 자리에서 컬렉션을 정렬 할 필요가있다.


답변

스위프트 3.0

images.sort(by: { (first: imageFile, second: imageFile) -> Bool in
    first. fileID < second. fileID
})


답변

당신은 또한 같은 것을 할 수 있습니다

images = sorted(images) {$0.fileID > $1.fileID}

따라서 이미지 배열은 정렬 된 것으로 저장됩니다