source

Swift: 객체 배열을 알파벳 순으로 정렬합니다.

nicesource 2023. 4. 9. 21:43
반응형

Swift: 객체 배열을 알파벳 순으로 정렬합니다.

이거 있어요.

class Movies {
  Name:String
  Date:Int
}

[무비] 시리즈도 있습니다.어레이를 이름순으로 정렬하려면 어떻게 해야 합니까?시도했습니다.

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

그리고.

movieArr = sorted(movieArr)

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

클로즈에서 다음 주소로 넘어갑니다.sort정렬할 속성을 비교합니다.다음과 같이 합니다.

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

또는 다음과 같은 경우가 있습니다.

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

사이드노트:일반적으로 대문자로 시작하는 것은 유형뿐입니다.name그리고.date,것은 아니다.Name그리고.Date.


예: 놀이터:

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. 와의 사용Movie준거하지 않는 클래스Comparable프로토콜

만약 당신이Movie클래스가 에 준거하지 않는다.Comparableprotocol은 어레이를 사용할 속성을 클로저에 지정해야 합니다.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. 와의 사용Movie준거하는 계급Comparable프로토콜

단, 고객님의Movie계급에 준거하다Comparable프로토콜, 어레이를 사용할 때 매우 간결한 코드를 사용할 수 있습니다.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. 와의 사용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 }

이러한 답변의 대부분은 정렬에 로케일 기반 비교를 사용하지 못하기 때문에 올바르지 않습니다.localized Standard Compare()를 확인합니다.

정렬 어레이 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!
    }*

언급URL : https://stackoverflow.com/questions/26719744/swift-sort-array-of-objects-alphabetically

반응형