Objective-C ( というより C ) を書くのが面倒すぎる
例えば、今コーディングしている状況はですね、次のような user defaults があって
Root: PaletteWindows: - PaletteNames: - Inspector - Navigator
パレットウィンドウがいくつかあって、そのウィンドウの中にまたいくつかパレットが入っている、photoshop のようなものを考えてもらうといいです。これを読みこんでパレットを組み立てる。
Objective-C で書くと、まあこんな感じになりますよ。
- (void)setupPalettesFromUserDefaults:(NSUserDefaults *)defaults { NSArray *paletteWindowInfo = [defaults arrayForKey:"PaletteWindows"]; if (!paletteWindowInfo) return; NSEnumerator *enumerator = [paletteWindowInfo objectEnumerator]; NSDictionary *info; while (info = [enumerator nextObject]) { NSArray *paletteNames = [info objectForKey:"PaletteNames"]; if (!paletteNames) continue; NSMutableArray *palettes = [NSMutableArray arrayWithCapacity:paletteNames count]]; NSEnumerator *paletteNameEnumerator = [paletteNames objectEnumerator]; NSString *paletteName; while (paletteName = [paletteNameEnumerator nextObject]) { PaletteController *palette = [PaletteController sharedPaletteControllerNamed:aletteName]; if (!palette) continue; [palettes addObject:alette]; } if (![palettes count]) continue; PaletteWindowController *paletteWindowController = [[[PaletteWindowController alloc] init] autorelease]; NSEnumerator *paletteEnumerator = [palettes objectEnumerator]; PaletteController *palette; while (palette = [paletteEnumerator nextObject]) { [paletteWindowController addPalette:palette]; } [self addPaletteWindowController paletteWindowController]; } }
めんどい。Ruby で書けばこのくらいになる。
def setupPalettesFromUserDefaults(defaults) (defaults['PaletteWindows'] || []).each do |info| palettes = (info['PaletteNames'] || []).map {|name| PaletteController.sharedPaletteController(name) }.compact next if palettes.size paletteWindowController = PaletteWindowController.new palettes.each {|palette| palettewindowcontroller.addPalette(palette) } addPaletteWindowController(paletteWindowController) end end
fast enumeration なら多少よくなるけど、OS 10.5 以上でしか動かないのでは使えないし。まいったね。Objective-C++ で boost::lambda とかはどうかな...うごくのかな...