[ios] 스위프트 : 알파벳 순서로 객체 배열 정렬

나는 이것을 가지고있다:

class Movies {
  Name:String
  Date:Int
}

그리고 [영화]의 배열. 이름순으로 배열을 알파벳순으로 정렬하려면 어떻게합니까? 난 노력 했어:

movieArr = movieArr.sorted{ $0 < $1 }

movieArr = sorted(movieArr)

영화의 이름 속성에 액세스하지 않기 때문에 작동하지 않습니다.



답변

에 전달할 클로저 sort에서 정렬하려는 속성을 비교하십시오. 이처럼 :

movieArr.sorted { $0.name < $1.name }

또는 사례를 우회하려는 경우 다음을 수행하십시오.

movieArr.sorted { $0.name.lowercased() < $1.name.lowercased() }

주석 : 일반적으로 유형 만 대문자로 시작합니다. 내가 사용하는 것이 좋습니다 것 name하고 date,하지 NameDate.


예를 들어 놀이터에서 :

class Movie {
    let name: String
    var date: Int?

    init(_ name: String) {
        self.name = name
    }
}

var movieA = Movie("A")
var movieB = Movie("B")
var movieC = Movie("C")

let movies = [movieB, movieC, movieA]
let sortedMovies = movies.sorted { $0.name < $1.name }
sortedMovies

sortedMovies 순서대로 될 것이다 [movieA, movieB, movieC]

Swift5 업데이트

channelsArray = channelsArray.sorted { (channel1, channel2) -> Bool in
            let channelName1 = channel1.name
            let channelName2 = channel2.name
            return (channelName1.localizedCaseInsensitiveCompare(channelName2) == .orderedAscending)


답변

Swift 3에서는 다음 방법 중 하나를 선택하여 문제를 해결할 수 있습니다.


1. 프로토콜을 준수하지 않는 클래스 sorted(by:​)와 함께 사용MovieComparable

Movie클래스가 Comparable프로토콜을 준수하지 않는 경우 클로저에서 Array의 sorted(by:​)메서드 를 사용하려는 속성을 지정해야합니다 .

Movie 클래스 선언 :

import Foundation

class Movie: CustomStringConvertible {

    let name: String
    var date: Date
    var description: String { return name }

    init(name: String, date: Date = Date()) {
        self.name = name
        self.date = date
    }

}

용법:

let avatarMovie = Movie(name: "Avatar")
let titanicMovie = Movie(name: "Titanic")
let piranhaMovie = Movie(name: "Piranha II: The Spawning")

let movies = [avatarMovie, titanicMovie, piranhaMovie]
let sortedMovies = movies.sorted(by: { $0.name < $1.name })
// let sortedMovies = movies.sorted { $0.name < $1.name } // also works

print(sortedMovies)

/*
prints: [Avatar, Piranha II: The Spawning, Titanic]
*/

2. 프로토콜 을 준수 sorted(by:​)하는 Movie클래스 와 함께 사용Comparable

그러나 Movie클래스가 Comparable프로토콜을 준수하도록 함으로써 Array의 sorted(by:​)메소드 를 사용하고자 할 때 훨씬 간결한 코드를 가질 수 있습니다 .

Movie 클래스 선언 :

import Foundation

class Movie: CustomStringConvertible, Comparable {

    let name: String
    var date: Date
    var description: String { return name }

    init(name: String, date: Date = Date()) {
        self.name = name
        self.date = date
    }

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

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

}

용법:

let avatarMovie = Movie(name: "Avatar")
let titanicMovie = Movie(name: "Titanic")
let piranhaMovie = Movie(name: "Piranha II: The Spawning")

let movies = [avatarMovie, titanicMovie, piranhaMovie]
let sortedMovies = movies.sorted(by: { $0 < $1 })
// let sortedMovies = movies.sorted { $0 < $1 } // also works
// let sortedMovies = movies.sorted(by: <) // also works

print(sortedMovies)

/*
 prints: [Avatar, Piranha II: The Spawning, Titanic]
 */

3. 프로토콜 을 준수 sorted()하는 Movie클래스 와 함께 사용Comparable

당신함으로써 Movie클래스에 부합 Comparable프로토콜, 당신은 배열의 사용 sorted()에 대한 대안으로 방법을 sorted(by:​).

Movie 클래스 선언 :

import Foundation

class Movie: CustomStringConvertible, Comparable {

    let name: String
    var date: Date
    var description: String { return name }

    init(name: String, date: Date = Date()) {
        self.name = name
        self.date = date
    }

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

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

}

용법:

let avatarMovie = Movie(name: "Avatar")
let titanicMovie = Movie(name: "Titanic")
let piranhaMovie = Movie(name: "Piranha II: The Spawning")

let movies = [avatarMovie, titanicMovie, piranhaMovie]
let sortedMovies = movies.sorted()

print(sortedMovies)

/*
 prints: [Avatar, Piranha II: The Spawning, Titanic]
 */


답변

let sortArray =  array.sorted(by: { $0.name.lowercased() < $1.name.lowercased() })


답변

Swift 3을 사용하는 경우 허용되는 답변에 해당하는 방법은 다음과 같습니다.

movieArr.sorted { $0.Name < $1.Name }


답변

정렬 된 배열 Swift 4.2

arrayOfRaces = arrayOfItems.sorted(by: { ($0["raceName"] as! String) < ($1["raceName"] as! String) })


답변

*import Foundation
import CoreData


extension Messages {

    @nonobjc public class func fetchRequest() -> NSFetchRequest<Messages> {
        return NSFetchRequest<Messages>(entityName: "Messages")
    }

    @NSManaged public var text: String?
    @NSManaged public var date: Date?
    @NSManaged public var friends: Friends?

}

    //here arrMessage is the array you can sort this array as under bellow

    var arrMessages = [Messages]()

    arrMessages.sort { (arrMessages1, arrMessages2) -> Bool in
               arrMessages1.date! > arrMessages2.date!
    }*


답변