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.