Back to site

YAML у Cocoa

Source: http://will.thimbleby.net/yaml.html



Навіны

У апошняй версіі какава парсер YAML даступна Syck GitHub.

Што гэта такое?

Пасля прагляду і спрабуеце рэдагаваць какава XML-выхадны файл або plists я вырашыў, што павінен быць лепшым рашэннем.... І ёсць. YAML. YAML, увогуле, значна больш чытэльным і consise чым XML з'яўляецца. Ён шырока выкарыстоўваецца ў скрыптовых моў, як Ruby. Вось два прыкладу:

YAML (Глядзіце не разметкі Ma'):
---
Author : William Shakespeare
Lines  : 
 - It is a tale told by an idiot,
 - Full of sound and fury, signifying nothing.
Birthdate: 1564
XML plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd">
<plist version="1.0">
<dict>
  <key>Author</key>
  <string>William Shakespeare</string>
  <key>Lines</key>
  <array>
    <string>It is a tale told by an idiot,</string>
    <string>Full of sound and fury, signifying nothing.</string>
  </array>
  <key>Birthdate</key>
  <integer>1564</integer>
</dict>
</plist>

Цяпер вы скажыце мне, які з'яўляецца больш зручным для чытання.

Як яго выкарыстоўваць

Не было б выдатна выкарыстоўваць гэта ў вашыя прыкладання какава? Ну цяпер вы можаце. Вось як вы гэта робіце:

id data = yaml_parse(yamlString);

І гэта ўсё. Вы можаце неаднаразова заклікалі getDocument: каб атрымаць астатнія дакументы ў файл. У сапраўдны момант усе YAML скаляр чытаюцца ў выглядзе радкоў, які працуе з радасцю, таму што ваш код па-ранейшаму проста выклікае floatValue: або intValue:. Вы можаце захоўваць дакументы ў YAML так:

[data yamlDescription];

Вельмі акуратным біт

Рэчы вы не можаце зрабіць у XML. Якара і даведніках. У YAML вы можаце зрабіць нешта накшталт гэтага:

---
hr:
 - Mark McGwire
 # Following node labeled SS
 - &SS Sammy Sosa
rbi:
 - *SS # Subsequent occurance
 - Ken Griffey

і... Вы можаце вызначаць свае уласныя тэгі рэальнага лёгка. У сукупнасці гэтыя зрабіць YAML вельмі магутны. Тэгі вызначаны наступным чынам:

-!!NSColor {r: 1, g: 0.5, b: 0}

А вось рэалізацыя ObjC:

@implementation NSColor (YAMLCocoaAdditions)

+(id) objectWithYAML:(id)data
{
 float	r=0, g=0, b=0, a=0;
 
 if([data isKindOfClass:[NSDictionary class]])
 {
  if([data objectForKey:@"r"]) r = [[data objectForKey:@"r"] floatValue];
  if([data objectForKey:@"g"]) g = [[data objectForKey:@"g"] floatValue];
  if([data objectForKey:@"b"]) b = [[data objectForKey:@"b"] floatValue];
  if([data objectForKey:@"a"]) a = [[data objectForKey:@"a"] floatValue];
 }
 
 return [NSColor colorWithDeviceRed:r green:g blue:b alpha:a];
}

-(id) toYAML
{
 return [NSDictionary dictionaryWithObjectsAndKeys:
  [NSNumber numberWithFloat:[self redComponent]],	@"r",
  [NSNumber numberWithFloat:[self greenComponent]],	@"g",
  [NSNumber numberWithFloat:[self blueComponent]],	@"b",
  [NSNumber numberWithFloat:[self alphaComponent]],	@"a", NULL];
}

@end

Зараз запусціце гэтыя шрубкі павароту

Падумайце, што вы можаце зрабіць з усім гэтым сіла!

--- 
-!!MyCircle
 center: &ORIGIN {x: 73, y: 129}
 radius: 7
-!!MyLine
 start: *ORIGIN
 finish: { x: 89, y: 102 }
-!!MyLable
 color:!cocoa/NSColor {r: 1, g: 0.9, b: 0.8, a: 0.2}
 value: Pretty vector drawing.
 start: *ORIGIN

Прачытайце яе, і вы будзеце мець масіў з трох графічных аб'ектаў ўсё звязана з пэўнай кропкі. Код для гэтых класаў павінны быць ажыццёўлены, і, вядома, у належным традыцыю, што застаецца ў якасці практыкаванні. Але гэта паказвае, наколькі лёгка выкарыстоўваць YAML для чытання і яшчэ складаныя файлы дадзеных.

Кантакты

Звяжыцеся са мной will@thimbleby.net калі нешта не працуе, што вам трэба, і, асабліва, калі ў вас ёсць памылка выпраўлення або код, каб унесці свой уклад.

Добра, дазвольце мне на гэта

У апошняй версіі какава парсер YAML даступная форма Syck GitHub.

Published (Last edited): Apr 12