Start Developing iOS Apps Today(9)~Foundationでの処理

2014. 03. 17
●Foundationでの処理

貴方がアプリのコードの記述を始める際に、利用することができる多くのObjective-Cフレームワークを見つけることができます。
特に重要なのは、全てのアプリのための基本的なサービスを提供するFoundationフレームワークです。
Foundationフレームワークは、文字列や数値など基本的なデータ型を表す値クラスだけでなく、他のオブジェクトを格納するためのコレクションクラスが含まれています。
ToDoListアプリの多くのコードを記述する中で、値とコレクションクラスに依存することになります。

foundation_2x.png



●値オブジェクト

Foundationフレームワークは文字列、バイナリデータ、日付と時刻、数値、およびその他の値の値オブジェクトを生成するクラスを提供します。

値オブジェクトは(Cデータ型の)プリミティブ値カプセル化したオブジェクトで、値と関連するサービスを提供します。
貴方はアプリが呼び出すメソッドや関数のパラメータや戻り値として、値オブジェクトに頻繁に遭遇します。
フレームワークの様々な部品(または別のフレームワーク)は値オブジェクトを渡すことによってデータを交換することができます。

Foundationフレームワークの値オブジェクトの例をいくつか示します。

  • NSStringとNSMutableString
  • NSDataとNSMutableData
  • NSDate
  • NSNumber
  • NSValue

値オブジェクトはスカラー値を表すため、コレクション内でオブジェクトが要求する場所の指定に使用することもできます。
値オブジェクトはカプセル化したプリミティブ型以上の利点があります。
簡単かつ効率的にカプセル化された値で特定の操作を実行してみましょう。
例えばNSStringクラスは、ファイルまたは(できれば)URLの文字列を記述し、ファイルシステムパスを構築する、部分文字列を検索して置換するためのメソッドを持っています。

プリミティブ型のデータから(その後、おそらくメソッドのパラメータに渡す)値オブジェクトを作成します。
コードでは、後でオブジェクトからカプセル化したデータにアクセスします。
NSNumberクラスは、このアプローチの最も明確な例を提供しています。

int n = 5;    // プリミティブ型に値を割り当てる
NSNumber *numberObject = [NSNumber numberWithInt:n];    // プリミティブ型から値オブジェクトを作成
int y = [numberObject intValue];    // 値オブジェクトからカプセル化した値を取得(y == n)

ほとんどの値クラスは、イニシャライザとクラスファクトリメソッドの両方を宣言することによって、そのインスタンスを作成します。
(クライアントのための便宜としてクラスによって実装されている)クラスファクトリメソッドは割り当てと初期化を1つの手順に組み合わせたもので、作成したオブジェクトを返します。
例えばNSStringクラスには、クラスの新しいインスタンスを割り当てて初期化し、貴方のコードに返す文字列クラスメソッドが宣言されています。

NSString *string = [NSString string];

値オブジェクトを作成、しカプセル化した値へのアクセスを許可することに加えて、ほとんどの値クラスはオブジェクトの比較などの単純な操作のためのメソッドを提供しています。


・文字列

Objective-CはCと同様に、文字列を指定するための同じ規則をサポートしています。
単一の文字は一重引用符で囲み、文字の文字列は二重引用符で囲みます。
ただし、Objective-Cフレームワークは通常C文字列を使用しません。
代わりにNSStringオブジェクトを使用します。

NSStringクラスは、任意長の文字列を格納するための組み込みメモリ管理や、様々な文字エンコーディング(特にUnicode)のサポート、そして文字列のフォーマットのためのユーティリティなどの利点を提供するため、文字列のオブジェクトラッパーを提供しています。
上記のように文字列は頻繁に使用されるため、Objective-Cは定数値からNSStringオブジェクトを作成するための簡略表記を提供しています。
このNSStringリテラルを使用するには、次の例のように二重引用符で囲んだ文字列の前にアットマーク(@)を置きます。

// 文字列「My String」+改行を作成します。
NSString *myString = @"My String\n";
// フォーマット済み文字列「1 String」を作成します。
NSString *anotherString = [NSString stringWithFormat:@"%d %@", 1, @"String"];
// C文字列からObjective-Cを作成します。
NSString *fromCString = [NSString stringWithCString:"A C string" encoding:NSUTF8StringEncoding];


・数字

Objective-CはNSNumberオブジェクトを作成するための簡略表記を提供しており、オブジェクトを作成するためにイニシャライザまたはクラスファクトリメソッドを呼び出す必要がありません。
単に数値の前にアットマーク(@)を置き、オプションで値の型を示すインジケータを後に付けます。
例えば、整数値やdouble値をカプセル化するNSNumberオブジェクトを作成するには、次のように記述することができます。

NSNumber *myIntValue = @32;
NSNumber *myDoubleValue = @3.22346432;

カプセル化したブール値や文字値の作成にもNSNumberリテラルを使用することができます。

NSNumber *myBoolValue = @YES;
NSNumber *myCharValue = @'V';

表記した値にそれぞれU、L、LL、Fという字を追加することによって、符号無し整数、long整数、long long整数、float値を表すNSNumberオブジェクトを作成することができます。
例えばfloat値をカプセル化したNSNumberオブジェクトを作成するには、次のように記述することができます。

NSNumber *myFloatValue = @3.2F



●コレクションオブジェクト

Objective-Cコードでのほとんどのコレクションオブジェクトは、NSArray、NSSet、そしてNSDictionaryといった基本的なコレクションクラスのいずれかのインスタンスです。
これらのクラスはオブジェクトのグループを管理するために使用されているので、コレクションに追加したい全ての項目はObjective-Cクラスのインスタンスにする必要があります。
スカラー値を追加する必要がある場合、最初にそれを表すのに適切なNSNumberまたはNSValueのインスタンスを作成する必要があります。

コレクションに追加した全てのオブジェクトは、少なくともコレクションが存在している間は存在し続けます。
なぜならコレクションクラスは、その内容の追跡を維持するために強い参照を使用しているからです。
内容の追跡を維持することに加えて、各コレクションクラスは列挙や特定の項目へのアクセス、または特定のオブジェクトがコレクションの一部であるかどうかを調べるなど、特定のタスクを実行することを容易にします。

NSArray、NSSet、そしてNSDictionaryクラスの内容は作成時に設定されます。
これらは経時変化しないため、不変と呼ばれます。
また、それぞれはオブジェクトを自由に追加や削除することができる、可変のサブクラスを持っています。
様々な種類のコレクションは、特有の方法でそれに含まれるオブジェクトを編成します。

  • NSArrayとNSMutableArray
    配列は順序付けされたオブジェクトのコレクションです。
    配列の位置(つまりインデックス)を指定することによってオブジェクトにアクセスします。
    配列の最初の要素はインデックス0(ゼロ)です。

  • NSSetとNSMutableSet
    セットは順序の無いオブジェクトのコレクションを格納しており、各オブジェクトは一度だけ発生します。
    一般的には、セット内のオブジェクトにテストまたはフィルタを適用することによって、セット内のオブジェクトにアクセスします。

  • NSDictionaryとNSMutableDictionary
    辞書はキーと値のペアとしてエントリを格納します。
    キーは一意の識別子で通常は文字列であり、値は格納したいオブジェクトです。
    キーを指定することによって、オブジェクトにアクセスします。


・配列

配列(NSArray)は、オブジェクトの順序付けされたリストを表すために使用されます。
唯一の要件は各項目がObjective-Cオブジェクトであるということで、各オブジェクトが同じクラスのインスタンスである必要はありません。

配列内の順序を維持するために、各要素はゼロベースのインデックスで格納されています。

orderedarrayofobjects.png


配列の作成

この章の前半で説明した値クラスと同様に、クラスファクトリメソッドまたは配列リテラルによって割り当てと初期化をし、配列を作成することができます。
オブジェクトの数に応じて、利用可能な様々な初期化とファクトリメソッドがあります。

+ (id)arrayWithObject:(id)anObject;
+ (id)arrayWithObjects:(id)firstObject, ...;
- (id)initWithObjects:(id)firstObject, ...;

arrayWithObjects:とinitWithObjects:メソッドは両方ともnil終端であるため引数は可変であり、最後の値としてnilを含める必要があります。

NSArray *someArray = [NSArray arrayWithObjects:someObject, someString, someNumber, someValue, nil];

この例では、先に示したような配列を作成しています。
最初のオブジェクトがsomeObjectで、0の配列インデックスを持っています。
最後のオブジェクトはsomeValueで、3のインデックスを持っています。

提供された値の一つがnilの場合、意図せずに項目のリストが切り詰められる可能性があります。

id firstObject = @"someString";
id secondObject = nil;
id thirdObject = @"anotherString";
NSArray *someArray = [NSArray arrayWithObjects:firstObject, secondObject, thirdObject, nil];

この場合secondObjectがnilなため項目のリストの最後として解釈され、someArrayにはfirstObjectのみが含まれます。

簡潔な構文を使用して配列リテラルを作成することが可能です。

NSArray *someArray = @[firstObject, secondObject, thirdObject];

この構文を使用する時、nilは実際には無効な値なので、nilを持つオブジェクトのリストで終了させないでください。
例えば以下のコードを実行しようとした場合、実行時に例外が発生します。

id firstObject = @"someString";
id secondObject = nil;
NSArray *someArray = @[firstObject, secondObject];
// 例外:"nilオブジェクトを挿入しようとしています"


配列オブジェクトの照会

配列を作成した後、オブジェクトをいくつ持っているか、または指定した項目が含まれているかどうかなどの情報を照会することができます。

NSUInteger numberOfItems = [someArray count];
if ([someArray containsObject:someString]) {
    ...
}

また指定したインデックスに在る配列の項目を照会することもできます。
無効なインデックスを要求しようとすると、実行時に範囲外の例外が発生します。
例外の発生を避けるために、最初に項目数を常に確認してください。

if ([someArray count] > 0) {
    NSLog(@"First item is: %@", [someArray objectAtIndex:0]);
}

この例では、項目数がゼロより大きいかどうかをチェックしています。
その場合、0のインデックスを持つ最初の項目の説明を、Foundation関数のNSLogで記録します。

objectAtIndex:を使用する代わりに、標準C配列で値にアクセスするように、添字構文を使用して配列の照会をすることもできます。
前述の例は以下のように書き換えることができます。

if ([someArray count] > 0) {
    NSLog(@"First item is: %@", someArray[0]);
}


配列オブジェクトの整列

NSArrayクラスは、収集されたオブジェクトを整列するための様々なメソッドを提供しています。
NSArrayは不変なので、それぞれのメソッドは整列された順序の項目を含む新しい配列を返します。

例えば各文字列でcompare:を呼び出すことによって、文字列の配列を整列することができます。

NSArray *unsortedStrings = @[@"gammaString", @"alphaString", @"betaString"];
NSArray *sortedStrings = [unsortedStrings sortedArrayUsingSelector:@selector(compare:)];


可変性

NSArrayクラス自体は不変ですが、可変オブジェクトを含めることができます。
例えば不変配列に可変文字列を追加する場合は以下のようになります。

NSMutableString *mutableString = [NSMutableString stringWithString:@"Hello"];
NSArray *immutableArray = @[mutableString];

文字列が変化しても貴方がすることはありません。

if ([immutableArray count] > 0) {
    id string = immutableArray[0];
    if ([string isKindOfClass:[NSMutableString class]]) {
        [string appendString:@" World!"];
    }
}

最初に作成した後で配列にオブジェクトを追加または削除したい場合、1つ以上のオブジェクトを追加や削除または置換するための様々なメソッドが追加されているNSMutableArrayを使用します。

NSMutableArray *mutableArray = [NSMutableArray array];
[mutableArray addObject:@"gamma"];
[mutableArray addObject:@"alpha"];
[mutableArray addObject:@"beta"];

[mutableArray replaceObjectAtIndex:0 withObject:@"epsilon"];

この例では、オブジェクト@"epsilon"、@"alpha"、@"beta"で構成された配列を作成しています。

これは2つ目の配列を作成することなく、所定の位置に可変配列を整列することもできます。

[mutableArray sortUsingSelector:@selector(caseInsensitiveCompare:)];

この場合、含まれる項目は大文字・小文字を区別しない順序で@"alpha"、@"beta"、@"epsilon"と昇順で整列されます。


・セット

セット(NSSet)オブジェクトは配列に似ていますが、個別のオブジェクトの順序無しグループを保持します。

unorderedsetofobjects.png

セットは順序を保持しないため、構成要素のテストの際は配列よりも高速な性能を提供します。

基本的なNSSetクラスは不変なため、割り当てと初期化、またはクラスファクトリメソッドのいずれかを使用して、作成時に内容を指定する必要があります。

NSSet *simpleSet = [NSSet setWithObjects:@"Hello, World!", @42, aValue, anObject, nil];

NSArrayと同様に、
initWithObjects:とsetWithObjects:メソッドは両方ともnil終端で、引数は可変です。
可変のNSSetサブクラス名はNSMutableSetです。

貴方が何度もオブジェクトの追加を試みた場合でも、セットは個々のオブジェクトに唯一の参照を格納します。

NSNumber *number = @42;
NSSet *numberSet = [NSSet setWithObjects:number, number, number, number, nil];
// numberSetには1つのみオブジェクトが含まれます


・辞書

辞書(NSDictionary)は単なる順序付けされた、または順序無しのオブジェクトのコレクションではなく、検索に使用することができる指定したキーに関連付けされたオブジェクトを格納するものです。

ベストプラクティスは、辞書のキーとして文字列オブジェクトを使用することです。

dictionaryofobjects.png

キーとして他のオブジェクトを使用することもできますが、各キーは辞書で使用するためにコピーされるため、NSCopyingをサポートしている必要があることを心に留めておいてください。
ただしキー値コーディング(詳細はキー値コーディングプログラミングガイド参照)を使用する場合は、辞書オブジェクト用に文字列キーを使用する必要があります。


辞書の作成

割り当てと初期化、またはクラスファクトリメソッドを使用して、以下のように辞書を作成することができます。

NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:
                     someObject, @"anObject",
              @"Hello, World!", @"helloString",
                                @42, @"magicNumber",
                      someValue, @"aValue",
                                    nil];

dictionaryWithObjectsAndKeys:とinitWithObjectsAndKeys:メソッドでは、各オブジェクトはキーの前で指定し、オブジェクトとキーのリストはnil終端にする必要があります。

Objective-Cは辞書リテラルを作成するための簡易構文を提供しています。

NSDictionary *dictionary = @{
                    @"anObject" : someObject,
                  @"helloString" : @"Hello, World!",
            @"magicNumber" : @42,
                        @"aValue" : someValue
};

辞書リテラルの場合、キーはオブジェクトの前で指定し、オブジェクトとキーのリストはnil終端ではありません。


辞書の照会

辞書を作成した後、指定されたキーに対して格納されているオブジェクトを尋ねることができます。

NSNumber *storedNumber = [dictionary objectForKey:@"magicNumber"];

オブジェクトが見つからない場合、objectForKey:メソッドはnilを返します。

またobjectForKey:の代わりに添字構文を使用することもできます。

NSNumber *storedNumber = dictionary[@"magicNumber"];


可変性

作成した後に辞書にオブジェクトを追加したり削除する必要がある場合は、NSMutableDictionaryサブクラスを使用します。

[dictionary setObject:@"another string" forKey:@"secondString"];
[dictionary removeObjectForKey:@"anObject"];


・nilとNSNullの表現

Objective-Cにおけるnilは"オブジェクトが無い"ことを意味するため、この節で説明したコレクションクラスにはnilを追加することはできません。
コレクション内で"オブジェクトが無い"ことを表す必要がある場合は、NSNullクラスを使用します。

NSArray *array = @[ @"string", @42, [NSNull null] ];

NSNullのnullメソッドは、常に同じインスタンスを返します。
このように動作するクラスをシングルトンクラスと呼びます。
配列内のオブジェクトが共有されているNSNullインスタンスと等しいかどうかは、以下のように確認することができます。

for (id object in array) {
    if (object == [NSNull null]) {
        NSLog(@"Found a null object");
    }
}



Foundationフレームワークにはここで説明したものよりも多くの機能が含まれていますが、すぐに個々の詳細を知っている必要はありません。
Foundationについてより学びたい場合は、Foundation Framework Referenceを見てください。
貴方は今ではカスタムデータクラスを記述することによる、ToDoListアプリの実装を継続するために十分な情報を持っています。



参考文献

Apple/Start Developing iOS Apps Today

0 CommentsPosted in 資料





Bose QuietComfort 25
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
02 | 2017/03 | 03
Sun Mon Tue Wed Thu Fri Sat
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 -
Recent Articles
iTunes


Swift
Categories
Tips
WACOM


Reference
NSApplicationDelegateプロトコル
NSArrayクラス
NSAutoreleasePoolクラス
NSBundleクラス
NSBundle UIKit追加分
NSCalendarクラス
NSCoderクラス
NSCodingプロトコル
NSCopyingプロトコル
NSDataクラス
NSDateクラス
NSDateFormatterクラス
NSDictionaryクラス
NSEntityDescriptionクラス
NSEnumeratorクラス
NSErrorクラス
NSExceptionクラス
NSFetchRequestクラス
NSFileHandleクラス
NSFileManagerクラス
NSIndexPathクラス
NSIndexPath UIKit追加分
NSKeyedArchiverクラス
NSKeyedUnarchiverクラス
NSKeyValueCodingプロトコル
NSLocaleクラス
NSManagedObjectクラス
NSManagedObjectContextクラス
NSManagedObjectModelクラス
NSMutableArrayクラス
NSMutableCopyingプロトコル
NSMutableDictionaryクラス
NSMutableSetクラス
NSNotificationクラス
NSNotificationCenterクラス
NSNullクラス
NSNumberクラス
NSObjectクラス
NSObject UIKit追加分
NSObjectプロトコル
NSPersistentStoreクラス
NSPersistentStoreCoordinatorクラス
NSPredicateクラス
NSPropertyListSerializationクラス
NSRunLoopクラス
NSSetクラス
NSStringクラス
NSString UIKit追加分
NSTimerクラス
NSTimeZoneクラス
NSURLクラス
NSURLProtectionSpaceクラス
NSURLRequestクラス
NSUserDefaultsクラス
NSValueクラス

UIActionSheetクラス
UIActionSheetDelegateプロトコル
UIActivityIndicatorViewクラス
UIAlertViewクラス
UIAlertViewDelegateプロトコル
UIApplicationクラス
UIApplicationDelegateプロトコル
UIBarButtonItemクラス
UIBarItemクラス
UIButtonクラス
UIColorクラス
UIControlクラス
UIDatePickerクラス
UIDeviceクラス
UIEventクラス
UIFontクラス
UIGestureRecognizerクラス
UIImageクラス
UIImageViewクラス
UIKit Function
UILabelクラス
UINavigationControllerクラス
UINavigationItemクラス
UIPickerViewクラス
UIPickerViewDataSourceプロトコル
UIPickerViewDelegateプロトコル
UIPinchGestureRecognizerクラス
UIResponderクラス
UIScreenクラス
UIScrollViewクラス
UISearchBarクラス
UISearchBarDelegateプロトコル
UISegmentedControlクラス
UISliderクラス
UISwipeGestureRecognizerクラス
UISwitchクラス
UITableViewクラス
UITableViewCellクラス
UITableViewControllerクラス
UITableViewDataSourceプロトコル
UITableViewDelegateプロトコル
UITapGestureRecognizerクラス
UITextFieldクラス
UITextFieldDelegateプロトコル
UITextInputTraitsプロトコル
UITextViewクラス
UITextViewDelegateプロトコル
UIToolbarクラス
UITouchクラス
UIViewクラス
UIViewControllerクラス
UIWebViewクラス
UIWebViewDelegateプロトコル
UIWindowクラス

AVAudioPlayerクラス
AVAudioPlayerDelegateプロトコル

CADisplayLinkクラス
CAEAGLLayerクラス
CALayerクラス

CGAffineTransform
CGBitmapContext
CGColor
CGColorSpace
CGContext
CGGeometry
CGImage
CGPath

EAGLContextクラス
EAGLDrawableプロトコル

Foundation Constants
Foundation Data Types
Foundation Functions

MPMediaItemクラス
MPMediaItemArtworkクラス
MPMediaPlaylistクラス
MPMediaPropertyPredicateクラス
MPMediaQueryクラス
MPMusicPlayerControllerクラス

Randomization Services

System Sound Services
BOSE

Bose QuietComfort 25
ARC
Technical Q&A
情報プロパティリストキー
Start Developing iOS Apps Today
SQLite
OpenGL ES
Amazon


Monthly Archives
Recent Comments
Recent TrackBacks
RSS Link
Profile

Author:水月杏香
永遠の初心者プログラマ。

QR Code
QR
Visitors