Nastal čas na kakao - Co nového ve Foundation Kitu - MujMAC.cz - Apple, Mac OS X, Apple iPod

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:

Seriály

Více seriálů



Informace

Nastal čas na kakao - Co nového ve Foundation Kitu

3. června 2005, 00.00 | Dříve, než pokročíme od základů Foundation Kitu k aplikačním službám knihovny AppKit se podíváme na to, co Tiger pro Foundation Kit přinesl nového: třídy NSAffineTransform, NSCalendar, novinky tříd NSError a NS...Formatter, třídy NSIndexPath, NSLocale či NSMetadata, nové služby třídy NSString, a některá další rozšíření.

V minulém dílu našeho seriálu o programování ve vývojovém systému Cocoa jsme dokončili popis nejdůležitějších tříd Foundation Kitu; jednalo se ovšem o popis tříd, jež nabízel Mac OS X 10.3 Panther, neboť jsme začali dávno předtím, než se Tiger vymanil z okovů NDA.

Dříve, než pokročíme od základů Foundation Kitu k aplikačním službám knihovny AppKit se tedy ještě podíváme na to, co Tiger pro Foundation Kit přinesl nového. Novinky AppKitu již samostatně popisovat samozřejmě nebudeme – AppKitu se budeme prostě věnovat v jeho současné, tj. tygří, podobě (zato se však zběžně podíváme aspoň na několik nejvýznamnějších novinek integrovaného vývojového prostředí Xcode, jež je nyní k dispozici ve versi 2.0).

Nejprve však slíbené novinky, jež Tiger přinesl Foundation Kitu: jedná se o třídy NSAffineTransform, NSCalendar, novinky tříd NSError a NS...Formatter, třídy NSIndexPath, NSLocale či NSMetadata, nové služby třídy NSString, a některá další rozšíření, jež jsou jen "pro pokročilé", a my se jimi proto na základní úrovni, na níž zatím systém Cocoa popisujeme, nebudeme zabývat.

Třída NSAffineTransform

Třída NSAffineTransform není v knihovnách Cocoa novinkou; Tiger jen přenesl její části, jež nejsou závislé na aplikačním prostředí, z AppKitu do Foundation Kitu. Tak lze nyní snadno a bez obtíží (a bez potřeby linkovat AppKit) používat i v řádkových programech převody grafických souřadnic.

My se budeme touto třídou a vším, co s ní souvisí, zabývat až později, až se budeme učit programování grafických výstupů (jakkoli v Tigeru můžeme v řadě případů namísto skutečného programování využít služeb Quartz Composeru ☺).

Třídy NSCalendar a NSDateComponents

Naproti tomu, třída NSCalendar je novinkou v Tigeru; doplňuje, rozšiřuje a mění zde služby tříd NSDate a NSCalendarDate, jež se dosud pro práci s daty používaly. Přesněji řečeno, služby třídy NSCalendarDate jsou nahrazeny službami třídy NSCalendar; třída NSDate ovšem nadále slouží pro určení absolutního časového momentu.

Třída NSCalendar pak interpretuje podle potřeby tento absolutní časový moment v rámci zvoleného kalendáře: základní kalendář je samozřejmě gregoriánský, který se standardně užívá prakticky ve všech západních zemích; Mac OS X Tiger však prostřednictvím služeb třídy NSCalendar podporuje práci s potenciálně libovolným kalendářem. Konkrétní kalendáře, jejichž implementace jsou k dispozici v současné versi 10.4.1, jsou vedle samozřejmého gregoriánského také buddhistický, hebrejský, islámský, islámský civilní a japonský.

Základní službou kalendáře – vedle získávání a nastavování různých atributů – je schopnost rozložit absolutní časový moment, representovaný instancí třídy NSDate, na jednotlivé komponenty, jimiž je v daném kalendáři representován (tedy rok, měsíc, den, hodina, minuta,...), a naopak, na základě daných komponent vytvořit odpovídající instanci NSDate. K tomu slouží metody components:fromDate: a dateFromComponents:. Komponenty samy pak jsou representovány instancí pomocné třídy NSDateComponents. Následující úsek kódu např. vytvoří objekt NSDate, odpovídající pevně určenému datu 24.5.2005 v gregoriánském kalendáři (bez ohledu na to, který kalendář užívá aktuální uživatel):

NSDateComponents *cc=[[[NSDateComponents alloc] init] autorelease];
[cc setDay:24];
[cc setMonth:5];
[cc setYear:2005];
NSCalendar *gc=[[[NSCalendar alloc]
    initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
NSDate *date=[gc dateFromComponents:cc];

Třídy NSDateFormatter a NSNumberFormatter

My jsme se dosud třídami NS...Formatter nezabývali, protože – jakkoli mohou sloužit obecně pro formátování údajů v libovolném programu, jenž používá Foundation Kit – nejčastěji se používají ve spolupráci s třídami AppKitu. Jejich využití si tedy ukážeme – podobně jako u tříd NSTimer či NSAffineTransform – později, až se budeme zabývat odpovídajícími službami aplikačních knihoven.

Jen v souvislosti se seznamem novinek ve Foundation Kitu Tigeru stojí za zmínku, že tyto třídy byly kompletně přepracovány tak, aby mohly využívat standardní open-source implementaci formátovacích služeb z knihoven ICU (International Components for Unicode).

Třída NSError

Třída NSError není novinkou Tigeru; je v něm však výrazně rozšířena a mnohem důsledněji využívána. My si ukážeme konkrétní příklady jejího využití v rámci programování aplikací; zjednodušeně řečeno ale je jejím účelem nést informaci o případné chybě, k níž došlo při zpracování požadované služby.

Vyžádáme-li si třeba vytvoření objektu třídy NSString na základě obsahu souboru – k tomu nyní slouží nová zpráva stringWithContentsOfFile:encoding:error: –, může se stát leccos, proč se akce nepodaří: třeba soubor vůbec neexistuje, nebo existuje, ale není čitelný. Nebo třeba je čitelný, avšak jeho obsah nelze rozumně interpretovat v daném encodingu... Ve všech těchto případech služba vrátí nil, ale navíc vrátí referencí také instanci třídy NSError, jejíž součástí je podrobná (a dokonce lokalizovatelná!) informace o tom, proč se akci nepodařilo provést.

Mimochodem, na první pohled by se mohlo zdát, že v takovém případě by služba měla generovat výjimku: není tomu tak, k tomu výjimky určeny nejsou. Více viz např. odstavec "Další možnosti" v dílu, věnovaném výjimkám.

Třída NSLocale

S novou podporou kalendářů a formátování – ale nejen s nimi – souvisejí služby další nové třídy, NSLocale. Ta shrnuje údaje, representující uživatelské předvolby týkající se jazykových, kulturních a podobných konvencí a standardů: patří sem právě volba kalendáře, standardní formátování dat a čísel, a podobná nastavení.

Třída NSIndexPath

Dalším příkladem tříd, jež – byť jsou součástí Foundation Kitu a tu a tam se najde jejich rozumné využití mimo aplikace – jsou v zásadě doplňkem aplikačních služeb a my si je proto popíšeme až později, v souvislosti s odpovídajícími možnostmi AppKitu, jsou třídy NSIndexSet a NSIndexPath; zde se o nich zmiňujeme proto, že druhá z nich je novinkou Tigeru, a podpora prvé je bohatší (kupříkladu si můžeme vyžádat odstranění objektů, jejichž indexy jsou v NSIndexSet, z instance NSMutableArray).

Instance těchto tříd representují skupinu indexů (Set) pro výběr více prvků z pole a řadu indexů (Path) pro určení cesty v hierarchické struktuře; nejčastěji se používají při práci s tabulkami a browsery v GUI.

Třídy NSMetadata...

Skupina nových tříd NSMetadataItem, NSMetadataQuery(a NSMetadataQueryAttributeValueTuple) a NSMetadataQueryResultGroup se objevila jako podpora technologie Spotlight: základem je třída NSMetadataQuery, jejímž prostřednictvím můžeme nyní z libovolného programu, jenž využívá Foundation Kitu, sestavovat vyhledávací dotazy do systému Spotlight.

Třída NSString a kódování znaků

Významnou novinkou, jíž dnešní díl v podstatě ukončíme, je poměrně rozsáhlé rozšíření služeb třídy NSString. Víme, že "odjakživa" třída NSString podporuje Unicode, a její instance tak mohou representovat libovolné znaky; z historických důvodů však jsou k dispozici některé metody (v Tigeru právě označené jako "deprecated"), jež převáděly stringy z Unicode do jiného kódování – nebylo však příliš jasné, do kterého. Typickým zástupcem byla zpráva cString, ovšem týž problém měly třeba i zprávy writeToFile:atomically: nebo – naopak – stringWithContentsOfFile:.

Nejdůležitější z nových metod, jež máme nyní k dispozici, jsou

-(const char*)cStringUsingEncoding:(NSStringEncoding)encoding;
-(BOOL)writeToFile:(NSString*)path atomically:(BOOL)useAuxiliaryFile
  encoding:(NSStringEncoding)enc error:(NSError**)error;
+stringWithCString:(const char*)cString encoding:(NSStringEncoding)enc;
+stringWithContentsOfFile:(NSString*)path
  encoding:(NSStringEncoding)enc error:(NSError**)error;
+stringWithContentsOfFile:(NSString*)path
  usedEncoding:(NSStringEncoding*)enc error:(NSError**)error;

a, samozřejmě, odpovídající metody initWith, a také odpovídající varianty s URL namísto jména souboru.

Za samostatnou zmínku stojí dvě věci: předně, varianta načtení ze souboru ...usedEncoding... se pokusí zjistit sama encoding na základě blíže neurčených heuristik, a nalezený encoding vrátí. Dále pak, ty služby, jež mohou skončit chybou, vracejí v takovém případě nil a referencí vrátí hodnotu NSError, obsahující bližší informace o chybě – viz výše.

Ostatní novinky

Tiger obsahuje novinek a rozšíření spoustu; ty nejdůležitější jsme ale již probrali, a další už jsou přece jen trochu "pro zkušenější" – ať již jde o rozšíření systému KVO (kdo neví co to je, ten to zatím vědět nepotřebuje ☺), nebo o podporu dynamického parsování XML...

Tímto přehledem tygřích novinek jsme tedy skončili přehled základních služeb Foundation Kitu. Příště se zase na chvilku vrátíme od šedé teorie k zelené – či, v prostředí Aqua, spíše modré – praxi, a podíváme se na to, jaké novinky nám přinesla nová verse integrovaného vývojového prostředí Xcode.

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » Informace  

 » Rubriky  » Agregator  

 » Rubriky  » Začínáme s  

 

 

 

Nejčtenější články
Nejlépe hodnocené články
Apple kurzy

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: