iPhoneアプリ開発Blog

iPhoneアプリ開発Blog

iPhoneアプリの開発について、誰でも分かる記事を書いていきます。

Amebaでブログを始めよう!
村松 恒平さんの本『プロ編集者による文章上達秘伝スクール』を読んだ。
なかなか文体が決まらず一歩踏み出せないでいたが、
そんなに深く悩む必要もないとふっきれた。

手順としては、まずはとにかく書く。
で、まとまった文量が溜まってから、推敲なりすればいい。
最初に大事なのは、書く「勢い」だ。
という訳で、コンテンツ作成を進めていく。


プロ編集者による文章上達秘伝スクール
昨日は絵を3点ほど描いてみた。
しかし、やはり、今まで絵を描く習慣がなかったせいもあり
まったく描けない。
資料を見ながら模写するだけなら、何となくそれっぽくはなるのだが、
時間がかかりすぎる。

アプリをリリースするまでの時間が伸びるのも嫌なので、
コンテンツは文章だけで作ることにする。
今まで、絵を描くことに大して興味もなく生きてきた。
誰しもそんなもんだとも思うのだが、何か描けと言われても
特に何も描けない。

ただ、ゲームやらアプリを作る上で、絵心やデザインってのは
どうしても必要になってくるものだ。
外注できるほどの資金もないので、自分で何とか描いてみる事にする。

上手くはなくてもいいが、インパクトのある絵は描きたい。
リリースへ向けて、現時点での課題を挙げる。

・iAdの挿入 ← 取組中
・文章を書く
・アイコン等の画像を用意する
・バージョン管理の方法を調べる
・リリースの告知をどうするか

コンマ区切り、改行文字ありのCSVからデータを配列に格納しするコードが
やっと完成した。せっかくなので記録しておく。

// DataSource.h - - + - - + - - + - - + - - + - - + - - + - - + - - + - -
#import
@interface DataSource : NSObject

@property NSString
*originalText, // CSCファイルの文字列そのまま
*cleanText, // CSVファイルから""を取り除いた文字列
*headerRowText, // フィールド行の文字列
*bodyText; // フィールド行以外の文字列

@property NSArray
*fields; // フィールド名

@property NSMutableArray
*words, // 単語
*contents; // 行列2次元配列

@property NSCharacterSet
*separator, // 区切り文字
*newliner; // 改行文字

@property unsigned long
fieldCount, // フィールド数
rowCount; // 行数

- (id) initWithCSV:(NSString *)filename separator:(NSString *)separator;

// オーバーライドするアクセサ
- (unsigned long)fieldCount;
- (void)setFieldCount:(unsigned long)fieldCount;
@end

// DataSource.m - - + - - + - - + - - + - - + - - + - - + - - + - - + - -
#import "DataSource.h"

@implementation DataSource

- (id)initWithCSV:(NSString *)filename separator:(NSString *)separator
{
if (self = [super init]) {
// CharacterSetの設定
{
self.separator = [NSCharacterSet characterSetWithCharactersInString:separator];
self.newliner = [NSCharacterSet newlineCharacterSet];
}

// CSVからoriginalTextへ格納
{
NSBundle *bundle = [NSBundle mainBundle];
NSString *path = [bundle pathForResource:filename ofType:@"csv"];
self.originalText = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
}

// originalから""を取り除く
{
self.cleanText = [self.originalText stringByReplacingOccurrencesOfString:@"\"" withString:@""];
}

// フィールド行の文字列をheaderRowText経由でfieldsへ格納し、bodyTextも設定
{
NSRange headRowRange = [self.cleanText lineRangeForRange:NSMakeRange(0, 0)];
self.headerRowText = [self.cleanText substringWithRange:headRowRange];
self.fields = [self.headerRowText componentsSeparatedByCharactersInSet:self.separator];
self.bodyText = [self.cleanText substringFromIndex:self.headerRowText.length];
}

// 行数を求め、行数分の容量を確保したcontentsを用意
{
NSArray *separateds = [self.cleanText componentsSeparatedByCharactersInSet:self.separator];
self.rowCount = (separateds.count - 1) / (self.fields.count - 1);
self.contents = [NSMutableArray arrayWithCapacity:self.rowCount];
}

// 行ごとに配列を作り、それをcontentsに配列として格納
{
// けずっていく用の文字列を用意
NSString *bufStr = [NSString stringWithString:self.bodyText];

for (int i = 0; i < self.rowCount; i++) {

// 検索範囲の設定
NSRange searchRange = NSMakeRange(0, bufStr.length);
// ラストコンマ
for (int i = 0; i < (self.fields.count - 1); i++) {
NSRange foundLocation = NSMakeRange(0, 0);
foundLocation = [bufStr rangeOfCharacterFromSet:self.separator options:NSCaseInsensitiveSearch range:searchRange];
searchRange.location = foundLocation.location + 1;
searchRange.length = (bufStr.length - (foundLocation.location + 1));
}
// 改行位置
NSRange foundLocation = [bufStr rangeOfCharacterFromSet:self.newliner options:NSCaseInsensitiveSearch range:searchRange];

if (foundLocation.location != NSNotFound) {
// NSString -> NSArray -> _contents
NSString *oneLineString = [bufStr substringToIndex:foundLocation.location];
NSArray *oneLineArray = [oneLineString componentsSeparatedByCharactersInSet:self.separator];
[self.contents addObject:oneLineArray];
// 格納した文字列を削除
bufStr = [bufStr substringFromIndex:foundLocation.location + 1];
continue;
} else {
NSString *lastLineString = [bufStr substringWithRange:[bufStr lineRangeForRange:searchRange]];
NSArray *lastArray = [lastLineString componentsSeparatedByCharactersInSet:self.separator];
[self.contents addObject:lastArray];
break;
}
}
NSLog(@"%@", @"break!");
}
}
return self;
}

- (unsigned long)fieldCount
{
if (self.fields) {
return self.fields.count;
} else {
return 0;
}
}

- (void)setFieldCount:(unsigned long)fieldCount
{
self.fieldCount = fieldCount;
}

@end