私はこれを持っています:
class Movies {
Name:String
Date:Int
}
および[映画]の配列。配列を名前のアルファベット順に並べ替えるにはどうすればよいですか?私はもう試した:
movieArr = movieArr.sorted{ $0 < $1 }
そして
movieArr = sorted(movieArr)
moviesのname属性にアクセスしていないため、これは機能しません。
sort
に渡すクロージャーで、ソートするプロパティを比較します。このような:
movieArr.sorted { $0.name < $1.name }
サイドノート:通常、タイプは大文字でのみ始まります。 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]
の順序になります
Swift 3では、次の方法のいずれかを選択して問題を解決できます。
Movie
プロトコルに準拠しないComparable
クラスで sorted(by:)
を使用する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]
*/
Movie
プロトコルに準拠するComparable
クラスで sorted(by:)
を使用するただし、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]
*/
Movie
プロトコルに準拠するComparable
クラスで sorted()
を使用するMovie
クラスをComparable
プロトコルに準拠させることにより、sorted()
の代わりに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()
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) })