ArrayCzęść NR.3Dzisiaj będziemy dalej odkrywać język programowania Objective-C używając przykładów także z C# dla porównania.

Tablice są często używane i ich składnia jest inna w Objective-C. Nie traćmy więc czasu i przejdźmy do przykładów.

Zanim zaczniesz pracować z tablicami w Objective-C najpierw musisz zdecydować czy będzie ona tylko do odczytu, czy nie. Jeśli tablica ma być tylko do odczytu wtedy używamy NSArray w przeciwnym wypadku gdy chcemy dodawać, odejmować elementy wtedy korzystam z NSMutableArray.

Aby utrzymywać przykłady dosyć jasno C#-powe wskazówki używając generycznej List<T>. Nie jest to odpowiedni tablicy, ale w tym kursie nie o to tutaj chodzi.

Deklarowanie tablicy z wartościami

List<string> data = new List<string>(new[] { "raz", "dwa" });
NSArray* data = [NSArray arrayWithObjects:@"raz",@"dwa" ,nil];

Warto zaznaczyć, że kolekcja elementów definiowana w taki sposób musi zawsze kończyć się wartością “nil”, czyli “null”.

Deklarowanie pustej tablic

List<string> data = new List<string>();
NSMutableArray* data2 = [[NSMutableArray alloc]init];

Warto tutaj zwróci uwagę, że tym razem deklaruje tablice  NSMutableArray. Co oznacza, że będę jej zawartość później modyfikował.

Dodawanie do tablicy elementów

List<string> data2 = new List<string>();
data.Add("raz");
NSMutableArray* data2 = [[NSMutableArray alloc]init];        
[data2 addObject:@"jeden"];
[data2 addObject:@"dwa"];
[data2 addObject:@"trzy"];
[data2 addObject:@"cztery"];

Dla każdego stałego napisu string w Objective-C dodajemy znak “@” przed wartością. Znak “@” ma zupełnie inną role niż w C#.

Wstawienie elementu do tablicy

List<string> data3 = new List<string>();
data3.Insert(0, "Zero");
NSMutableArray* data2 = [[NSMutableArray alloc]init];  
[data2 insertObject:@"zero" atIndex:0];

Usuniecie elementu z tablicy

data3.Remove("raz");
data3.RemoveAt(0);
data3.RemoveAt(data.Count - 1);
[data2 removeObject:@"jeden"];
        
[data2 removeObjectAtIndex:1];
        
[data2 removeLastObject];

Objective-C posiada metodę “RemoveLastObject”. C# takiej metody nie posiada.

Długość tablicy

int count = data3.Count();
int count = [data2 count];

Dostęp do obiektu znajdującego w tablicy

string napis = data3[0];
NSString* val = [data2 objectAtIndex:0];

Tworzenie tablicy liczbowej

List<int> list = new List<int>();
list.Add(1);
NSMutableArray* numbers = [[NSMutableArray alloc]init];
[numbers addObject:@10];        
[numbers addObject:[NSNumber numberWithInt:2]];

Wykonanie pętli wokół kolekcji

foreach (var item in list)
{
		//zrób coś
}
for (NSString* val = @"" in data2) {
    NSLog(val);
}

Sprawdzanie istnienia elementu w tablicy

bool exist = data3.Contains("raz");
BOOL exist = [data2 containsObject:@"zero"];

Znalezienie indeksu danego elementu

int index = data.IndexOf("raz");
int index = [data2 indexOfObject:@"trzy"];

Sortowanie

Oto jak posortować napisy po ich długości.

C#

Pamiętam ,że kiedyś wymyśliłem lepszy sposób na sortowanie elementów w kolekcji przy pomocy LINQ, ale standardowo w C# do sortowania kolekcji potrzebujemy klasy dziedziczącej po interfejsie IComparer .

Utworzenie klasy dziedziczącej po IComparer

public class SortAlphabetLength : System.Collections.IComparer
{
    public int Compare(Object x, Object y)
    {
        if (x.ToString().Length == y.ToString().Length)
            return System.String.CompareOrdinal(x.ToString(), y.ToString());
        else if (x.ToString().Length > y.ToString().Length)
            return 1;
        else
            return -1;
    }
}

Użycie klasy

data2.Sort(new SortAlphabetLength());

Objective-C

Do sortowania w Objective-C jest potrzebna jest instancja klasy “NSSortDescriptor” jak i instancja tablicy, która będzie zawierać wszystkie instancje klasy opisuje jak sortowanie ma przebiegać.

Dla klasy “NSSortDescriptor” ważnym parametrem jest “Key”, który jest napisem określający właściwości, po jakim dany element ma być sortowany. W tym wypadku jest to @”length”.

Trzeba być ostrożny, ponieważ każdy może się pomylić pisząc nazwę właściwości.

NSMutableArray* data2 = [[NSMutableArray alloc]init];
        
[data2 addObject:@"jeden"];
[data2 addObject:@"dwa"];
[data2 addObject:@"trzy"];
[data2 addObject:@"cztery"];
        
[data2 insertObject:@"zero" atIndex:0];
        
[data2 removeObject:@"jeden"];
        
[data2 removeObjectAtIndex:1];
        
[data2 removeLastObject];
        
NSString* aSearchString = @"length";
[data2 addObject:@"jedenascie"];
[data2 addObject:@"11"];

        
NSSortDescriptor * frequencyDescriptor =[[NSSortDescriptor alloc] initWithKey:aSearchString ascending:YES ];
        
NSArray * descriptors =    [NSArray arrayWithObjects:frequencyDescriptor, nil];
[data2 sortUsingDescriptors:descriptors];
        
        
for (NSString* val = @"" in data2) {
    NSLog(val);
}

Kod powinien zwrócić następujący wynik w konsoli. Jak widać elementy w tablic zostały posortowane i napis “11” jest pierwszy ,a napis “jedenaście” jest ostatni.

image