Alaposztályok – iOS

A framework számos osztályt ad felhasználásra készen, melyek valamiféle érték tárolására hivatottak (value classes). Ezek az osztályok leginkább elemi típusokat tárolnak  ám nem elemi adatként hanem objektumként. Ez igen sok esetben hasznos, sőt nemegyszer nélkülözhetetlen (struktúra mint argumentum).

Ebben a cikkben ezekről az alaptípusokról esik szó.

NSString

A string kezeléssel kapcsolatban már megalapoztuk tudásunkat a Objective-C gyorstalpaló III. – iOS cikkben. Az alapokon túl érdemes még néhány gyakran felhasználható aprósággal megismerkedni:

Formázás

Akkor lehet hasznos ha egy szöveg konstans összeállítása több, akár más-más típusú változók, objektumok felhasználásával történik:

    int appleCount = 4;
    NSString *myInformation =
      [NSString
         stringWithFormat:@"there are %d apples on the table...", appleCount];
    NSLog(@"%@", myInformation);

there are 4 apples on the table…

A felhasználható formátum specifikációk gyűjteménye az Apple oldalán olvasható.

Felsorolást tartalmazó string-ből lista

Amennyiben CSV típusú string-get kell feldolgoznunk, esetleg jól jöhet, ha készítünk belőle egy gyűjteményt vagy listát:

    NSString *csvLine = @"one,two,three,...";
    NSArray *fieldsOfLine = [csvLine componentsSeparatedByString:@","];
    int i = 0;
    for (NSString *actString in fieldsOfLine) {
        NSLog(@"%d. element of array is --> %@", ++i, actString);
    }

1. element of array is –> one
2. element of array is –> two
3. element of array is –> three
4. element of array is –> …

Rész-string felhasználás

Az egyik leggyakoribb string kezelési művelet, amikor keresünk valamit egy string-ben, illetve a string valamely részét használjuk fel.

    NSString *fieldsInString = @"1:codeA 2:codeB 3:codeC";

    // search by key=3
    NSRange myRange = [fieldsInString rangeOfString:@"3:"];
    if (myRange.location != NSNotFound) {
        NSLog(@"found key at position %d with length %d",
              myRange.location,
              myRange.length);

        // get value by key
        NSString *subString =
          [fieldsInString
           substringWithRange:NSMakeRange(myRange.location+myRange.length, 5)];
        NSLog(@"the code with key is: %@", subString);
    } else {
        NSLog(@"key not found!");
    }

found key at position 15 with length 3
the code with key is: codeC

Mint a fenti példából kiderült, a string kezelésnél több esetben is hasznát vesszük majd az NSRange struktúrának.

Összehasonlítás

    NSString *s1 = @"Hi Guy!";
    NSString *s2 = @"Hello friend";

    // check for equals
    BOOL stringsEquals = [s1 isEqualToString:s2];
    NSLog(@"s1 equals with s2: %@", stringsEquals?@"YES":@"NO");

    // check for prefix
    BOOL hasPrefix = [s1 hasPrefix:@"Hi"];
    NSLog(@"s1 has prefix 'Hi': %@", hasPrefix?@"YES":@"NO");

    // check for postfix
    BOOL hasPostfix = [s2 hasSuffix:@"end"];
    NSLog(@"s2 has postfix 'end': %@", hasPostfix?@"YES":@"NO");

s1 equals with s2: NO
s1 has prefix ‘Hi’: YES
s2 has postfix ‘end’: YES

Konvertálás

String-ből a legtöbb alaptípusra igen egyszerű konvertálással át lehet térni:

    NSString *value = @"3.14";
    NSLog(@"%d", [value intValue]);
    NSLog(@"%d", [value boolValue]);
    NSLog(@"%f", [value floatValue]);

3
1
3.140000

NSNumber

Egy általános érték tárolására szolgáló osztály, amelyben bármilyen numerikus mennyiség tárolása megoldott. A tárolás nagyon hasonlít arra amit az előzőekben a string kezelésnél láttunk, mivel a lekérdezés alkalmával teljesen más numerikus típust is megadhatunk mint amivel inicializáltuk a tárolót.

NSNumber *myNumber = [[NSNumber alloc]initWithFloat:3.14];
NSLog(@"%d", [myNumber intValue]);
NSLog(@"%d", [myNumber boolValue]);
NSLog(@"%f", [myNumber floatValue]);

3
1
3.140000

Az inicializálásnál tetszőleges konstruktor felhasználható, épp mint az érték lekérdezésénél, azaz használhatunk akár initWithInt-et is.

További lehetőségek

Használhatjuk továbbá az NSInteger, NSUinteger típusokat amennyiben egész értékeket reprezentáló objektumokkal szeretnénk dolgozni. Nem egész számokkal végzett műveletekben érdemes használni az NSDecimalNumber osztály, így elkerülhetők a lebegőpontos alaptípusokkal sokszor együtt járó kerekítési hibák.

NSDate

Dátumok kezelésére bevezetett value class.

    // date of today
    NSDate *day = [NSDate date];

    // date formatter object
    NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
    formatter.dateFormat = @"YYYY-MM-dd";
    NSLog(@"date of today is %@", [formatter stringFromDate:day]);

date of today is 2010-04-09

A dátumok kezeléséhez a value class mellett egy formatter osztályt is kapunk, amelynek segítségével a dátum-string átalakításokat kezelhetjük.

NSValue

Az NSValue class csomagolja be valamennyi eddig még nem említett alaptípusunkat, amely többségében az egyes framework-ökhöz tartozó struktúrákat jelenti. A mellékelt link dokumentálja például a UIKit által használt struktúrákat, melyeket NSValue-ként fel lehet használni.

Amennyiben saját struktúráinkat szeretnénk NSValue csomagolásba bújtatni, saját Category-t kell írnunk az NSValue fölé.

NSData

Ez az osztály segít a stream szerű adatok egy objektumba zárásában. Akár egy fájl tartalma, akár egy url-ről betöltött tartalom tárolható benne. Annyit érdemes róla tudni, hogy nagyobb, nem feltétlenül tipizálható adatszerkezetek tárolására szolgál. Leginkább úgy érdemes rá gondolni, mint valamiféle buffer-re.

Amennyiben szükség lenne rá, hogy ilyen adattárolót implementáljuk, nézzük meg a Binary Data Programming Guide-ot.

In june clicking here 1967, after numerous military threats presented by egypt, israel launched a pre-emptive attack on egypt’s airforce, starting the six-day war
Kategória: Általános | A közvetlen link.