カスタムオブジェクトを含むNSMutableArrayを並べ替える方法を教えてください。


1268

やりたいことはとてもシンプルに見えますが、Webで答えを見つけることができません。私が持っているNSMutableArrayオブジェクトのを、とのは、彼らが「人」オブジェクトであるとしましょう。であるNSMutableArrayPerson.birthDateで並べ替えたいNSDate

私はそれがこの方法と関係があると思います:

NSArray *sortedArray = [drinkDetails sortedArrayUsingSelector:@selector(???)];

Javaでは、オブジェクトをComparableに実装するか、Collections.sortをインラインカスタムコンパレーターで使用します... Objective-Cでこれをどのように実行しますか?

回答:


2299

比較方法

オブジェクトの比較メソッドを実装するか:

- (NSComparisonResult)compare:(Person *)otherObject {
    return [self.birthDate compare:otherObject.birthDate];
}

NSArray *sortedArray = [drinkDetails sortedArrayUsingSelector:@selector(compare:)];

NSSortDescriptor(より良い)

または通常さらに良い:

NSSortDescriptor *sortDescriptor;
sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"birthDate"
                                           ascending:YES];
NSArray *sortedArray = [drinkDetails sortedArrayUsingDescriptors:@[sortDescriptor]];

配列に複数のキーを追加することで、複数のキーで簡単に並べ替えることができます。カスタムコンパレータメソッドを使用することも可能です。ドキュメントをご覧ください。

ブロック(光沢!)

Mac OS X 10.6とiOS 4以降、ブロックで並べ替える可能性もあります。

NSArray *sortedArray;
sortedArray = [drinkDetails sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
    NSDate *first = [(Person*)a birthDate];
    NSDate *second = [(Person*)b birthDate];
    return [first compare:second];
}];

パフォーマンス

-compare:ブロックベースの方法は、一般に、使用するよりも、かなり速くなりNSSortDescriptor、後者はKVCに依存しています。このNSSortDescriptorメソッドの主な利点は、コードではなくデータを使用して並べ替え順序を定義する方法を提供することです。これにより、たとえば、ユーザーがNSTableViewヘッダー行をクリックして並べ替えできるように簡単に設定できます。


66
最初の例にはバグがあります。あるオブジェクトのbirthDateインスタンス変数を、birthDate変数ではなく、他のオブジェクト自体と比較します。
Martin Gjaldbaek、

90
@マーティン:ありがとう!私が75票を獲得する前に、他の誰も気づかなかったことはおかしい。
GeorgSchölly

76
これは受け入れられた回答であり、したがってほとんどのユーザーによって決定的であると考えられるため、3番目のブロックベースの例を追加して、ユーザーがそれも存在することを認識できるようにすると役立つ場合があります。
jpswain 2011

6
@ orange80:試してみました。私はMacをもう所有していないので、コードを見ていただければ幸いです。
GeorgSchölly、2011

11
あなたが持っている場合NSMutableArray私はmethodes sortUsingDescriptorssortUsingFunctionまたはを使用することを好むsortUsingSelector。配列が変更可能である限り、通常、ソートされたコピーは必要ありません。
ステファン

109

NSMutableArray方法を見るsortUsingFunction:context:

(2つのオブジェクトを比較しているため、タイプPersonが2つのPerson)オブジェクトとコンテキストパラメータを取る比較関数を設定する必要があります。

2つのオブジェクトはのインスタンスにすぎませんPerson。3番目のオブジェクトは、@@ birthDateなどの文字列です。

この関数は、返すNSComparisonResult:それは返すNSOrderedAscending場合PersonA.birthDate、< PersonB.birthDate。>のNSOrderedDescending場合に戻ります。最後に、==の場合に戻ります。PersonA.birthDatePersonB.birthDateNSOrderedSamePersonA.birthDatePersonB.birthDate

これは大まかな疑似コードです。ある日付が別の日付と「より少ない」、「より多い」、または「等しい」ことの意味を具体化する必要があります(秒以降の比較など)。

NSComparisonResult compare(Person *firstPerson, Person *secondPerson, void *context) {
  if ([firstPerson birthDate] < [secondPerson birthDate])
    return NSOrderedAscending;
  else if ([firstPerson birthDate] > [secondPerson birthDate])
    return NSOrderedDescending;
  else 
    return NSOrderedSame;
}

よりコンパクトなものが必要な場合は、三項演算子を使用できます。

NSComparisonResult compare(Person *firstPerson, Person *secondPerson, void *context) {
  return ([firstPerson birthDate] < [secondPerson birthDate]) ? NSOrderedAscending : ([firstPerson birthDate] > [secondPerson birthDate]) ? NSOrderedDescending : NSOrderedSame;
}

インライン化を行うと、多くの場合、これを少し高速化できます。


9
sortUsingFunction:context:の使用は、おそらく最もc風の方法であり、間違いなく最も読みにくい方法です。
GeorgSchölly2009

12
実際には何も問題はありませんが、今ではもっと良い代替案があると思います。
GeorgSchölly2009

6
おそらく、しかし、Javaの抽象的なComparatorクラスに似ているものを探しているJavaのバックグラウンドの誰かが、compare(Type obj1、Type obj2)を実装していると、それが読みにくくなるとは思いません。
Alex Reynolds、

5
技術的なメリットがほとんどないとしても、この完全に素晴らしい答えを批判する理由が何であれ、あなたのカップルが探しているという感覚がわかります。変だ。
Alex Reynolds、

1
@Yar:最初の段落で提供したソリューションを使用するか、複数のソート記述子を使用します。sortedArrayUsingDescriptors:引数としてソート記述子の配列を取ります。
GeorgSchölly

62

私はこれをiOS 4でブロックを使用して行いました。配列の要素をidからクラス型にキャストする必要がありました。この場合は、ポイントと呼ばれるプロパティを持つスコアと呼ばれるクラスでした。

また、配列の要素が適切な型でない場合の対処方法を決定する必要もあります。この例ではNSOrderedSame、を返しましたが、コードでは例外ですが。

NSArray *sorted = [_scores sortedArrayUsingComparator:^(id obj1, id obj2){
    if ([obj1 isKindOfClass:[Score class]] && [obj2 isKindOfClass:[Score class]]) {
        Score *s1 = obj1;
        Score *s2 = obj2;

        if (s1.points > s2.points) {
            return (NSComparisonResult)NSOrderedAscending;
        } else if (s1.points < s2.points) {
            return (NSComparisonResult)NSOrderedDescending;
        }
    }

    // TODO: default is the same?
    return (NSComparisonResult)NSOrderedSame;
}];

return sorted;

PS:これは降順のソートです。


6
実際には「(Score *)」キャストは必要ありません。「Score * s1 = obj1;」を実行するだけです。idはコンパイラからの警告なしに何にでも喜んでキャストするからです:-)
jpswain

右のOrange80 downcastingでは、弱い変数の前にキャストする必要はありません。
thesummersign

nilとnot-nilを一貫して上または下に並べ替える必要があるため、デフォルトの終了リターンはreturn ((!obj1 && !obj2) ? NSOrderedSame : (obj1 ? NSOrderedAscending : NSOrderedDescending))
Scott Corscadden

クリス、私はこのコードを試してみました、私はプログラムで更新を行います..初めて正しいジョブを実行すると、降順の出力が得られました..しかし、更新すると(同じデータで同じコードを実行します)、変更されました順序は、降順ではありませんでした。配列にhv 4個のオブジェクトがあり、3個のデータが同じデータで、1個が異なっているとします。
Nikesh K

「Score」クラスではないオブジェクトが実際に必要な場合は、それらをもう少し慎重にソートする必要があります。そうしないと、他の==スコア1 <スコア2 ==その他の状態になり、一貫性がなくなり、問題が発生する可能性があります。スコアオブジェクトが他のすべてのオブジェクトの前にソートされ、他のすべてのオブジェクトが互いに等しくソートされることを意味する値を返すことができます。
gnasher729 2014

29

iOS 4以降、並べ替えにブロックを使用することもできます。

この特定の例では、配列内のオブジェクトにを返す 'position'メソッドがあると想定していますNSInteger

NSArray *arrayToSort = where ever you get the array from... ;
NSComparisonResult (^sortBlock)(id, id) = ^(id obj1, id obj2) 
{
    if ([obj1 position] > [obj2 position]) 
    { 
        return (NSComparisonResult)NSOrderedDescending;
    }
    if ([obj1 position] < [obj2 position]) 
    {
        return (NSComparisonResult)NSOrderedAscending;
    }
    return (NSComparisonResult)NSOrderedSame;
};
NSArray *sorted = [arrayToSort sortedArrayUsingComparator:sortBlock];

注:「並べ替えられた」配列は自動解放されます。


26

私はすべて試しましたが、これでうまくいきました。クラスに「crimeScene」という名前の別のクラスがあり、「crimeScene」のプロパティでソートしたい。

これは魅力のように機能します:

NSSortDescriptor *sorter = [[NSSortDescriptor alloc] initWithKey:@"crimeScene.distance" ascending:YES];
[self.arrAnnotations sortUsingDescriptors:[NSArray arrayWithObject:sorter]];

21

GeorgSchöllyの2番目の回答には足りないステップがありますが、その場合は問題なく動作します。

NSSortDescriptor *sortDescriptor;
sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"birthDate"
                                              ascending:YES] autorelease];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
NSArray *sortedArray;
sortedArray = [drinkDetails sortedArrayUsingDescriptors:sortDescriptors];

// 's'を追加したのは、コピーして貼り付けたときに時間が浪費され、sortedArrayUsingDescriptorsに 's'がないと失敗したためです。


メソッド呼び出しは、実際には「sortedArrayUsingDescriptors:」であり、末尾に「s」が付いています。
CIFilter 2009年

19
NSSortDescriptor *sortDescriptor;
sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"birthDate" ascending:YES] autorelease];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
NSArray *sortedArray;
sortedArray = [drinkDetails sortedArrayUsingDescriptors:sortDescriptors];

おかげで、うまくいきます...


17

あなたのPersonオブジェクトは、メソッドを実装する必要があると言うcompare:別とるPersonオブジェクトを返すとNSComparisonResult2つのオブジェクト間の関係に応じました。

次にsortedArrayUsingSelector:@selector(compare:)、それが行われる必要があります。

他の方法もありますが、私の知る限り、ComparableインターフェイスのCocoa-equivはありません。使用することsortedArrayUsingSelector:はおそらくそれを行うための最も簡単な方法です。


9

iOS 4ブロックはあなたを救います:)

featuresArray = [[unsortedFeaturesArray sortedArrayUsingComparator: ^(id a, id b)  
{
    DMSeatFeature *first = ( DMSeatFeature* ) a;
    DMSeatFeature *second = ( DMSeatFeature* ) b;

    if ( first.quality == second.quality )
        return NSOrderedSame;
    else
    {
        if ( eSeatQualityGreen  == m_seatQuality || eSeatQualityYellowGreen == m_seatQuality || eSeatQualityDefault  == m_seatQuality )
        {
            if ( first.quality < second.quality )
                return NSOrderedAscending;
            else
                return NSOrderedDescending;
        }
        else // eSeatQualityRed || eSeatQualityYellow
        {
            if ( first.quality > second.quality )
                return NSOrderedAscending;
            else
                return NSOrderedDescending;
        } 
    }
}] retain];

http://sokol8.blogspot.com/2011/04/sorting-nsarray-with-blocks.html少し説明


8

についてNSMutableArrayは、sortUsingSelectorメソッドを使用します。新しいインスタンスを作成せずに、it-placeをソートします。


ただの更新:私も可変配列を所定の位置にソートするものを探していましたが、iOS 7以降、すべての「sortedArrayUsing」メソッドに対応する「sortUsing」同等のメソッドがありますsortUsingComparator:
jmathew 2013年

7

目的に応じて、次の一般的な方法を使用できます。それはあなたの問題を解決するはずです。

//Called method
-(NSMutableArray*)sortArrayList:(NSMutableArray*)arrDeviceList filterKeyName:(NSString*)sortKeyName ascending:(BOOL)isAscending{
    NSSortDescriptor *sorter = [[NSSortDescriptor alloc] initWithKey:sortKeyName ascending:isAscending];
    [arrDeviceList sortUsingDescriptors:[NSArray arrayWithObject:sorter]];
    return arrDeviceList;
}

//Calling method
[self sortArrayList:arrSomeList filterKeyName:@"anything like date,name etc" ascending:YES];

6

の配列を並べ替えるだけの場合はNSNumbers、1回の呼び出しで並べ替えることができます。

[arrayToSort sortUsingSelector: @selector(compare:)];

これは、配列NSNumber内のオブジェクト(objects)がcompareメソッドを実装しているため機能します。NSStringオブジェクトや、compareメソッドを実装するカスタムデータオブジェクトの配列に対しても同じことができます。

以下は、コンパレータブロックを使用したコードの例です。ディクショナリの配列をソートします。各ディクショナリには、キー「sort_key」に番号が含まれています。

#define SORT_KEY @\"sort_key\"

[anArray sortUsingComparator: 
 ^(id obj1, id obj2) 
  {
  NSInteger value1 = [[obj1 objectForKey: SORT_KEY] intValue];
  NSInteger value2 = [[obj2 objectForKey: SORT_KEY] intValue];
  if (value1 > value2) 
{
  return (NSComparisonResult)NSOrderedDescending;
  }

  if (value1 < value2) 
{
  return (NSComparisonResult)NSOrderedAscending;
  }
    return (NSComparisonResult)NSOrderedSame;
 }];

上記のコードは、方法を示すために、各ソートキーの整数値を取得して比較する作業を行っています。以来NSNumberオブジェクトが比較メソッドを実装し、それははるかに簡単に書き換えることができます。

 #define SORT_KEY @\"sort_key\"

[anArray sortUsingComparator: 
^(id obj1, id obj2) 
 {
  NSNumber* key1 = [obj1 objectForKey: SORT_KEY];
  NSNumber* key2 = [obj2 objectForKey: SORT_KEY];
  return [key1 compare: key2];
 }];

または、コンパレーターの本体を1行にまで蒸留することもできます。

  return [[obj1 objectForKey: SORT_KEY] compare: [obj2 objectForKey: SORT_KEY]];

コードは読みやすく、デバッグも簡単なので、私は単純なステートメントと多くの一時変数を好む傾向があります。とにかく、コンパイラーは一時変数を最適化しますので、オールインワンバージョンの利点はありません。


5

Linq to ObjectiveCと呼ばれるカテゴリメソッドの小さなライブラリを作成しました。これにより、このようなことがより簡単になります。キーセレクターで並べ替え方法を使用すると、birthDate次のように並べ替えることができます。

NSArray* sortedByBirthDate = [input sort:^id(id person) {
    return [person birthDate];
}]

あなたはそれを「LINQ to Objective-C」と呼ぶべきです。
Peter Mortensen

5

カスタム要件に基づいて、マルチレベルのソートを実行しました。

//値を並べ替えます

    [arrItem sortUsingComparator:^NSComparisonResult (id a, id b){

    ItemDetail * itemA = (ItemDetail*)a;
    ItemDetail* itemB =(ItemDetail*)b;

    //item price are same
    if (itemA.m_price.m_selling== itemB.m_price.m_selling) {

        NSComparisonResult result=  [itemA.m_itemName compare:itemB.m_itemName];

        //if item names are same, then monogramminginfo has to come before the non monograme item
        if (result==NSOrderedSame) {

            if (itemA.m_monogrammingInfo) {
                return NSOrderedAscending;
            }else{
                return NSOrderedDescending;
            }
        }
        return result;
    }

    //asscending order
    return itemA.m_price.m_selling > itemB.m_price.m_selling;
}];

https://sites.google.com/site/greateindiaclub/mobil-apps/ios/multilevelsortinginiosobjectivec


5

私はいくつかのプロジェクトでsortUsingFunction ::を使用しました:

int SortPlays(id a, id b, void* context)
{
    Play* p1 = a;
    Play* p2 = b;
    if (p1.score<p2.score) 
        return NSOrderedDescending;
    else if (p1.score>p2.score) 
        return NSOrderedAscending;
    return NSOrderedSame;
}

...
[validPlays sortUsingFunction:SortPlays context:nil];

5

NSSortDescriptorを使用して、カスタムオブジェクトでNSMutableArrayをソートします

 NSSortDescriptor *sortingDescriptor;
 sortingDescriptor = [[NSSortDescriptor alloc] initWithKey:@"birthDate"
                                       ascending:YES];
 NSArray *sortArray = [drinkDetails sortedArrayUsingDescriptors:@[sortDescriptor]];

4
-(NSMutableArray*) sortArray:(NSMutableArray *)toBeSorted 
{
  NSArray *sortedArray;
  sortedArray = [toBeSorted sortedArrayUsingComparator:^NSComparisonResult(id a, id b) 
  {
    return [a compare:b];
 }];
 return [sortedArray mutableCopy];
}

新しい配列が返されたときに、可変配列を渡す理由 なぜラッパーを作成するのですか?
vikingosegundo 2013年

3

並べ替えNSMutableArrayは非常に簡単です。

NSMutableArray *arrayToFilter =
     [[NSMutableArray arrayWithObjects:@"Photoshop",
                                       @"Flex",
                                       @"AIR",
                                       @"Flash",
                                       @"Acrobat", nil] autorelease];

NSMutableArray *productsToRemove = [[NSMutableArray array] autorelease];

for (NSString *products in arrayToFilter) {
    if (fliterText &&
        [products rangeOfString:fliterText
                        options:NSLiteralSearch|NSCaseInsensitiveSearch].length == 0)

        [productsToRemove addObject:products];
}
[arrayToFilter removeObjectsInArray:productsToRemove];

2

NSComparatorを使用して並べ替え

カスタムオブジェクトを並べ替える場合は、提供する必要がありNSComparatorます。これは、カスタムオブジェクトの比較に使用されます。ブロックはNSComparisonResult、2つのオブジェクトの順序を示す値を返します。したがって、配列全体をソートするにNSComparatorは、次のように使用します。

NSArray *sortedArray = [employeesArray sortedArrayUsingComparator:^NSComparisonResult(Employee *e1, Employee *e2){
    return [e1.firstname compare:e2.firstname];    
}];

NSSortDescriptorを使用した並べ替え
例として、カスタムクラスのインスタンスを含む配列があり、従業員に属性firstname、lastname、およびageがあると仮定します。次の例は、配列の内容を年齢キーで昇順に並べ替えるために使用できるNSSortDescriptorを作成する方法を示しています。

NSSortDescriptor *ageDescriptor = [[NSSortDescriptor alloc] initWithKey:@"age" ascending:YES];
NSArray *sortDescriptors = @[ageDescriptor];
NSArray *sortedArray = [employeesArray sortedArrayUsingDescriptors:sortDescriptors];

カスタム比較を使用した並べ替え
名前は文字列であり、ユーザーに提示するために文字列を並べ替えるときは、常にローカライズされた比較を使用する必要があります。多くの場合、大文字と小文字を区別しない比較も実行します。(localizedStandardCompare :)を使用して、姓と名で配列を並べ替える例を示します。

NSSortDescriptor *lastNameDescriptor = [[NSSortDescriptor alloc]
              initWithKey:@"lastName" ascending:YES selector:@selector(localizedStandardCompare:)];
NSSortDescriptor * firstNameDescriptor = [[NSSortDescriptor alloc]
              initWithKey:@"firstName" ascending:YES selector:@selector(localizedStandardCompare:)];
NSArray *sortDescriptors = @[lastNameDescriptor, firstNameDescriptor];
NSArray *sortedArray = [employeesArray sortedArrayUsingDescriptors:sortDescriptors];

参照および詳細な説明については、https//developer.apple.com/library/ios/documentation/Cocoa/Conceptual/SortDescriptors/Articles/Creating.html http://www.ios-blog.co.uk/tutorialsを参照して ください
。 / objective-c / how-to-sort-nsarray-with-custom-objects /


1

Swiftのプロトコルと関数型プログラミングにより、クラスをComparableプロトコルに準拠させ、プロトコルに必要なメソッドを実装し、sorted(by:)高次関数を使用して、使用することなくソートされた配列を作成することが非常に簡単になります。ちなみに可変配列。

class Person: Comparable {
    var birthDate: NSDate?
    let name: String

    init(name: String) {
        self.name = name
    }

    static func ==(lhs: Person, rhs: Person) -> Bool {
        return lhs.birthDate === rhs.birthDate || lhs.birthDate?.compare(rhs.birthDate as! Date) == .orderedSame
    }

    static func <(lhs: Person, rhs: Person) -> Bool {
        return lhs.birthDate?.compare(rhs.birthDate as! Date) == .orderedAscending
    }

    static func >(lhs: Person, rhs: Person) -> Bool {
        return lhs.birthDate?.compare(rhs.birthDate as! Date) == .orderedDescending
    }

}

let p1 = Person(name: "Sasha")
p1.birthDate = NSDate() 

let p2 = Person(name: "James")
p2.birthDate = NSDate()//he is older by miliseconds

if p1 == p2 {
    print("they are the same") //they are not
}

let persons = [p1, p2]

//sort the array based on who is older
let sortedPersons = persons.sorted(by: {$0 > $1})

//print sasha which is p1
print(persons.first?.name)
//print James which is the "older"
print(sortedPersons.first?.name)

1

私の場合、「sortedArrayUsingComparator」を使用して配列をソートします。以下のコードを見てください。

contactArray = [[NSArray arrayWithArray:[contactSet allObjects]] sortedArrayUsingComparator:^NSComparisonResult(ContactListData *obj1, ContactListData *obj2) {
    NSString *obj1Str = [NSString stringWithFormat:@"%@ %@",obj1.contactName,obj1.contactSurname];
    NSString *obj2Str = [NSString stringWithFormat:@"%@ %@",obj2.contactName,obj2.contactSurname];
    return [obj1Str compare:obj2Str];
}];

また、私の目的は、

@interface ContactListData : JsonData
@property(nonatomic,strong) NSString * contactName;
@property(nonatomic,strong) NSString * contactSurname;
@property(nonatomic,strong) NSString * contactPhoneNumber;
@property(nonatomic) BOOL isSelected;
@end

1

sortDescriptorを作成してから、以下のようにsortDescriptorを使用してnsmutablearrayをソートできます。

 let sortDescriptor = NSSortDescriptor(key: "birthDate", ascending: true, selector: #selector(NSString.compare(_:)))
 let array = NSMutableArray(array: self.aryExist.sortedArray(using: [sortDescriptor]))
 print(array)

1

ネストされたオブジェクトにはこのように使用し、

NSSortDescriptor * sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"lastRoute.to.lastname" ascending:YES selector:@selector(caseInsensitiveCompare:)];
NSMutableArray *sortedPackages = [[NSMutableArray alloc]initWithArray:[packages sortedArrayUsingDescriptors:@[sortDescriptor]]];

lastRouteは1つのオブジェクトであり、そのオブジェクトはtoオブジェクトを保持し、そのオブジェクトはlastname文字列値を保持します。


0

Swiftで配列を並べ替え


以下のSwifty人にとっては、グローバルに上記の目標を達成するための非常にクリーンなテクニックです。Userいくつかの属性を持つカスタムクラスの例を見てみましょう。

class User: NSObject {
    var id: String?
    var name: String?
    var email: String?
    var createdDate: Date?
}

これでcreatedDate、昇順または降順、あるいはその両方に基づいてソートする必要がある配列ができました。それでは、日付を比較する関数を追加しましょう。

class User: NSObject {
    var id: String?
    var name: String?
    var email: String?
    var createdDate: Date?
    func checkForOrder(_ otherUser: User, _ order: ComparisonResult) -> Bool {
        if let myCreatedDate = self.createdDate, let othersCreatedDate = otherUser.createdDate {
            //This line will compare both date with the order that has been passed.
            return myCreatedDate.compare(othersCreatedDate) == order
        }
        return false
    }
}

extensionArrayforを見てみましょうUser。簡単に言えば、Userオブジェクトしか含まれていない配列に対してのみ、いくつかのメソッドを追加できます。

extension Array where Element: User {
    //This method only takes an order type. i.e ComparisonResult.orderedAscending
    func sortUserByDate(_ order: ComparisonResult) -> [User] {
        let sortedArray = self.sorted { (user1, user2) -> Bool in
            return user1.checkForOrder(user2, order)
        }
        return sortedArray
    }
}

昇順の使用法

let sortedArray = someArray.sortUserByDate(.orderedAscending)

降順の使用法

let sortedArray = someArray.sortUserByDate(.orderedAscending)

同じ注文の使用法

let sortedArray = someArray.sortUserByDate(.orderedSame)

上記のメソッドは、タイプが ||のextension場合にのみアクセスできます。Array[User]Array<User>


0

Swiftバージョン:5.1

カスタムの構造体またはクラスがあり、それらを任意にソートする場合は、指定したフィールドでソートする末尾のクロージャーを使用してsort()を呼び出す必要があります。以下は、特定のプロパティでソートするカスタム構造体の配列を使用した例です。

    struct User {
        var firstName: String
    }

    var users = [
        User(firstName: "Jemima"),
        User(firstName: "Peter"),
        User(firstName: "David"),
        User(firstName: "Kelly"),
        User(firstName: "Isabella")
    ]

    users.sort {
        $0.firstName < $1.firstName
    }

並べ替えるのではなく、並べ替えられた配列を返す場合は、sorted()を次のように使用します。

    let sortedUsers = users.sorted {
        $0.firstName < $1.firstName
    }

0
  let sortedUsers = users.sorted {
    $0.firstName < $1.firstName
 }

問題はNSMutableArrayに関するものであり、SwiftのArraysコレクションに関するものではありません
Ricardo

-2
NSMutableArray *stockHoldingCompanies = [NSMutableArray arrayWithObjects:fortune1stock,fortune2stock,fortune3stock,fortune4stock,fortune5stock,fortune6stock , nil];

NSSortDescriptor *sortOrder = [NSSortDescriptor sortDescriptorWithKey:@"companyName" ascending:NO];

[stockHoldingCompanies sortUsingDescriptors:[NSArray arrayWithObject:sortOrder]];

NSEnumerator *enumerator = [stockHoldingCompanies objectEnumerator];

ForeignStockHolding *stockHoldingCompany;

NSLog(@"Fortune 6 companies sorted by Company Name");

    while (stockHoldingCompany = [enumerator nextObject]) {
        NSLog(@"===============================");
        NSLog(@"CompanyName:%@",stockHoldingCompany.companyName);
        NSLog(@"Purchase Share Price:%.2f",stockHoldingCompany.purchaseSharePrice);
        NSLog(@"Current Share Price: %.2f",stockHoldingCompany.currentSharePrice);
        NSLog(@"Number of Shares: %i",stockHoldingCompany.numberOfShares);
        NSLog(@"Cost in Dollars: %.2f",[stockHoldingCompany costInDollars]);
        NSLog(@"Value in Dollars : %.2f",[stockHoldingCompany valueInDollars]);
    }
    NSLog(@"===============================");
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.