Swift: Nesne dizisini alfabetik olarak sırala


138

Bu bende var:

class Movies {
  Name:String
  Date:Int
}

ve bir dizi [Film]. Diziyi alfabetik olarak ada göre nasıl sıralayabilirim? Denedim:

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

ve

movieArr = sorted(movieArr)

ancak bu işe yaramıyor çünkü Filmler'in ad özelliğine erişemiyorum.

Yanıtlar:


297

Geçtiğiniz kapakta sort, sıralamak istediğiniz özellikleri karşılaştırın. Bunun gibi:

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

veya vakaları atlamak istediğiniz durumlarda aşağıdakiler:

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

Sidenote: Tipik olarak sadece tipler büyük harfle başlar; Ben tavsiye ederim nameve datedeğil, Nameve Date.


Örneğin, bir oyun alanında:

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 sırayla olacak [movieA, movieB, movieC]

Swift5 Güncellemesi

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

Teşekkürler, ben sadece Swift ile başlıyorum ve kapakların kullanımını bilmiyordum.
cdpalmer

1
movies.sorted yerine movies.sort kullanın @Mike S
Oskariagon

1
açıklama için teşekkürler. Düzenlememi geliştirdim, iyi olmalı, lütfen bir göz atın :)
Julian Król

8
Dikkat edin, büyük harfle yazılan veya yazılmayan dizeleri sıralarken işe yaramaz. Karşılaştırmak .lowercaseStringbu sorunu çözecektir.
Matthieu Riegler

2
@EricAya sortedYine Swift 3'te olduğunu unutmayın : D.
dvp.petrov

45

Swift 3 ile sorununuzu çözmek için aşağıdaki yollardan birini seçebilirsiniz.


1. Protokole uymayan sorted(by:​)bir Moviesınıfla kullanmaComparable

Sizin ise Moviesınıf uymuyor Comparableprotokol, kendi kapatma size kullanım Dizisinin istediğiniz ana özelliği belirtmelisiniz sorted(by:​)yöntemle.

Movie sınıf bildirimi:

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
    }

}

Kullanımı:

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. Protokole uygun sorted(by:​)bir Moviesınıfla kullanmaComparable

Ancak, Moviesınıfınızı Comparableprotokole uygun hale getirerek, Array sorted(by:​)yöntemini kullanmak istediğinizde çok özlü bir koda sahip olabilirsiniz .

Movie sınıf bildirimi:

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
    }

}

Kullanımı:

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. Protokole uygun sorted()bir Moviesınıfla kullanmaComparable

MovieSınıfınızı Comparableprotokole uygun hale getirerek sorted()alternatif olarak Array yöntemini kullanabilirsiniz sorted(by:​).

Movie sınıf bildirimi:

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
    }

}

Kullanımı:

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]
 */

Hey, fark var mı. 2 ve 3 arasında ( movies.sorted(by: <)ve hariç movies.sorted())?
Kamaldeep singh Bhatia

sorted(by:)ve sorted()iki farklı yöntemdir. array.sorted()Alternatif olarak kullanabilirsiniz array.sorted(by: <).
Imanou Petit

Evet, sadece sınıf tanımı durumunda bir şeyi değiştirmemiz gerekmekte midir? Bence ikisi için de aynı sınıf tanımına sahip olabilir, demek sorted(by:)ve sorted()?
Kamaldeep singh Bhatia

1
Evet, sınıfınızın / yapınızın her halükarda Comparableprotokole uyması gereken aynı uygulamaya sahip olabilirsiniz .
Imanou Petit

Artan sırada shoer zaman customObject ile Array var bu uygun şekilde kısa değil. "1" "14""28""31""4""42""49"
Krunal Nagvadia

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

.lowercased () ekleyerek uzun bir deneme süresinden sonra benim için çalıştı. Nedenini anlamıyorum, çünkü tüm metinler küçük harflerle başlıyor.
Tom Tallak Solbu


14

Swift 3 kullananlar için, kabul edilen cevap için eşdeğer yöntem şöyledir:

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

1

Sıralı dizi Swift 4.2

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

0
*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!
    }*
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.