[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
,하지 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. 프로토콜을 준수하지 않는 클래스 sorted(by:)
와 함께 사용Movie
Comparable
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!
}*