imageFileというカスタムクラスがあり、このクラスには2つのプロパティが含まれているとしましょう。
class imageFile {
var fileName = String()
var fileID = Int()
}
それらの多くはArrayに格納されています
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&4
images.sorted(by: { $0.fileID > $1.fileID })
上の例では desc sortの順序になっています
[ Swift 3用にsort(by :) ]で更新されました。これは末尾のクロージャを悪用したものです。
images.sorted { $0.fileID < $1.fileID }
aSCまたはDESCに応じて、それぞれ<
または>
を使用します。images
配列 を変更したい場合は、以下を使用してください。
images.sort { $0.fileID < $1.fileID }
これを繰り返し実行して関数を定義したい場合は、1つの方法があります。
func sorterForFileIDASC(this:imageFile, that:imageFile) -> Bool {
return this.fileID > that.fileID
}
そして次のように使います。
images.sort(by: sorterForFileIDASC)
ほぼ全員が how を直接与えます。その進化を見せてください。
あなたは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 })
Sortの動作原理についての詳細な説明は、 ソート済み関数 を参照してください。
スイフト3
people = people.sorted(by: { $0.email > $1.email })
Swift 5では、Array
には sorted()
と sorted(by:)
という2つのメソッドがあります。最初のメソッドsorted()
には、次の宣言があります。
ソートされたコレクションの要素を返します。
func sorted() -> [Element]
2番目のメソッドsorted(by:)
には、次の宣言があります。
与えられた述語を要素間の比較として使ってソートされた、コレクションの要素を返します。
func sorted(by areInIncreasingOrder: (Element, Element) throws -> Bool) rethrows -> [Element]
コレクション内の要素タイプがComparable
プロトコルに準拠している場合は、要素を昇順でソートするためにsorted()
を使用できます。次のPlaygroundコードは、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]
*/
コレクション内の要素型が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]
*/
コレクションをその場でソートする必要がある場合は、Swiftにはsort()
およびsort(by:)
の対応物として sorted()
および sorted(by:)
という2つのメソッドも用意されています。
Swift 3.0では
images.sort(by: { (first: imageFile, second: imageFile) -> Bool in
first. fileID < second. fileID
})
2つの選択肢
1)sortInPlaceを使って元の配列を並べる
self.assignments.sortInPlace({ $0.order < $1.order })
self.printAssignments(assignments)
2)順序付き配列を格納するための代替配列の使用
var assignmentsO = [Assignment] ()
assignmentsO = self.assignments.sort({ $0.order < $1.order })
self.printAssignments(assignmentsO)
次のようなこともできます
images = sorted(images) {$0.fileID > $1.fileID}
だからあなたの画像配列はソートされたものとして保存されます
スイフト2から4 /
元の答えは、いくつかのプロパティを使ってカスタムオブジェクトの配列をソートしようとしました。以下に、Swiftデータ構造を使用して同じ動作をするためのいくつかの便利な方法を示します。
些細なことで、ImageFileを少しだけ変更しました。それを念頭に置いて、私は 3 imageファイルで配列を作成します。メタデータはオプションの値であり、パラメータとしてnilを渡すことが期待されることに注意してください。
struct ImageFile {
var name: String
var metadata: String?
var size: Int
}
var images: [ImageFile] = [ImageFile(name: "HelloWorld", metadata: nil, size: 256), ImageFile(name: "Traveling Salesmen", metadata: "uh this is huge", size: 1024), ImageFile(name: "Slack", metadata: "what's in this stuff?", size: 2048) ]
ImageFileには、sizeという名前のプロパティがあります。次の例では、sizeなどのプロパティを使ったソート操作の使い方を説明します。
最小サイズから最大サイズ(<)
let sizeSmallestSorted = images.sorted { (initial, next) -> Bool in
return initial.size < next.size
}
最大から最小(>)
let sizeBiggestSorted = images.sorted { (initial, next) -> Bool in
return initial.size > next.size
}
次に、Stringプロパティ名を使ってソートします。同様に、sortを使って文字列を比較します。しかし、内側のブロックが比較結果を返すことに注意してください。この結果はソートを定義します。
A-Z(.orderedAscending)
let nameAscendingSorted = images.sorted { (initial, next) -> Bool in
return initial.name.compare(next.name) == .orderedAscending
}
Z-A(.orderedDescending)
let nameDescendingSorted = images.sorted { (initial, next) -> Bool in
return initial.name.compare(next.name) == .orderedDescending
}
次にソートするのが好きな方法です。多くの場合、オプションのプロパティがあります。今心配しないで、我々はnilを扱わなければならないことを除いて上記と同じ方法でソートするつもりです!生産中;
このコードを使用して、nilプロパティ値を持つ配列内のすべてのインスタンスを最後に強制します。次に、想定されたラップされていない値を使用してメタデータを並べ替えます。
let metadataFirst = images.sorted { (initial, next) -> Bool in
guard initial.metadata != nil else { return true }
guard next.metadata != nil else { return true }
return initial.metadata!.compare(next.metadata!) == .orderedAscending
}
オプションのために二次的なソートをすることは可能です。例えば;画像をメタデータ付きでサイズ順に表示できます。
Swift 4.0、4.1、4.2最初に、以下に示すように、imageFile()型の可変配列を作成しました。
var arr = [imageFile]()
ImageFile()型の可変オブジェクト画像を作成し、以下に示すようにプロパティに値を割り当てます。
var image = imageFile()
image.fileId = 14
image.fileName = "A"
さて、このオブジェクトを配列arrに追加します
arr.append(image)
さて、同じ可変オブジェクト、すなわちimageに異なるプロパティを割り当てます
image = imageFile()
image.fileId = 13
image.fileName = "B"
さて、画像オブジェクトを配列arrに追加します
arr.append(image)
今度は、 昇順 on fileId プロパティを配列arrオブジェクトに適用します。昇順に <記号 を使用
arr = arr.sorted(by: {$0.fileId < $1.fileId}) // arr has all objects in Ascending order
print("sorted array is",arr[0].fileId)// sorted array is 13
print("sorted array is",arr[1].fileId)//sorted array is 14
さて、配列arrオブジェクトの fileId プロパティに 降順 onを適用します。降順に > symbol を使用します。
arr = arr.sorted(by: {$0.fileId > $1.fileId}) // arr has all objects in Descending order
print("Unsorted array is",arr[0].fileId)// Unsorted array is 14
print("Unsorted array is",arr[1].fileId)// Unsorted array is 13
Swiftでは4.1。 &4.2ソート順の使用
let sortedArr = arr.sorted { (id1, id2) -> Bool in
return id1.fileId < id2.fileId // Use > for Descending order
}
この配列を複数の場所でソートする予定がある場合は、配列型をComparableにすることをお勧めします。
class MyImageType: Comparable, Printable {
var fileID: Int
// For Printable
var description: String {
get {
return "ID: \(fileID)"
}
}
init(fileID: Int) {
self.fileID = fileID
}
}
// For Comparable
func <(left: MyImageType, right: MyImageType) -> Bool {
return left.fileID < right.fileID
}
// For Comparable
func ==(left: MyImageType, right: MyImageType) -> Bool {
return left.fileID == right.fileID
}
let one = MyImageType(fileID: 1)
let two = MyImageType(fileID: 2)
let twoA = MyImageType(fileID: 2)
let three = MyImageType(fileID: 3)
let a1 = [one, three, two]
// return a sorted array
println(sorted(a1)) // "[ID: 1, ID: 2, ID: 3]"
var a2 = [two, one, twoA, three]
// sort the array 'in place'
sort(&a2)
println(a2) // "[ID: 1, ID: 2, ID: 2, ID: 3]"
もしあなたがカスタムオブジェクトを使用していなくて、代わりにComparableプロトコル(Int、Stringなど)を実装する値型を使用しているなら、あなたは単にこれをすることができます:
myArray.sort(>) //sort descending order
例:
struct MyStruct: Comparable {
var name = "Untitled"
}
func <(lhs: MyStruct, rhs: MyStruct) -> Bool {
return lhs.name < rhs.name
}
// Implementation of == required by Equatable
func ==(lhs: MyStruct, rhs: MyStruct) -> Bool {
return lhs.name == rhs.name
}
let value1 = MyStruct()
var value2 = MyStruct()
value2.name = "A New Name"
var anArray:[MyStruct] = []
anArray.append(value1)
anArray.append(value2)
anArray.sort(>) // This will sort the array in descending order
私はこれをこのようにします、そしてそれは働きます:
var images = [imageFile]() images.sorted(by: {$0.fileID.compare($1.fileID) == .orderedAscending })
カスタムオブジェクトの元の配列を並べ替えたい場合。これはSwift 2.1で別の方法があります
var myCustomerArray = [Customer]()
myCustomerArray.sortInPlace {(customer1:Customer, customer2:Customer) -> Bool in
customer1.id < customer2.id
}
id
は整数です。 String
プロパティにも同じ<
演算子を使用できます。
あなたはここで例を見ることによってその使用についてもっと学ぶことができます: Swift2:近隣の顧客
var students = ["Kofi", "Abena", "Peter", "Kweku", "Akosua"]
students.sort(by: >)
print(students)
プリント:"["Peter", "Kweku", "Kofi", "Akosua", "Abena"]"
次の方法でfileIDプロパティからソートされた配列を返します。
スイフト2
let sortedArray = images.sorted({ $0.fileID > $1.fileID })
スイフト3 OR 4
let sortedArray = images.sorted(by: { $0.fileID > $1.fileID })
Swift 5.0
let sortedArray = images.sorted {
$0.fileID < $1.fileID
}
スイフト3&4&5
私は小文字と大文字と小文字の関係で問題がありました
だから私はこのコードをやった
let sortedImages = images.sorted(by: { $0.fileID.lowercased() < $1.fileID.lowercased() })
そしてその後でsortedImagesを使う