====== Foundation ======
//Foundation// ist das Basis-Framework von Apple für [[macosx:development|MacOS X]] und [[ios:development|iOS]].
Die Klassen von Foundation beginnen i.d.R. mit dem Kürzel "NS" als Abkürzung für das, von Steve Jobs entwickelte, Betriebssystem [[wp>NeXTSTEP|NeXTSTEP]], auf dessen Komponenten MacOS X basiert.
===== Hello World =====
Ein einfaches Programm in [[objc:start|Objective-C]] mit dem Foundation-Framework und ''NSAutorelasePool'':
#import
int main(int argc, char const *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSLog("Hello World!");
[pool drain];
return 0;
}
===== Logging mit NSLog =====
Logging einer Variable ''foo'' vom Typ ''NSString'':
NSLog(@"foo: %@", foo);
===== Konstanten =====
Konstanten sollten mit dem Foundation-Framework als "statische Eigenschaften" definiert werden, statt über das noch aus [[c:start|C]] übliche ''#define'' (siehe dazu [[objc:start#konstanten|Objective-C: Konstanten]]).
Für eine statische Eigenschaft wird in der Header-Datei einer Klasse über dem ''@interface''-Block diese mit den Schlüsselwörtern ''extern'' und ''const'' definiert. Bei der Benennung der Konstanten ist es auch oft üblich diese mit einem kleinen "k" zu beginnen.
extern NSString * const kFooBar;
In der Implementierungs-Datei wird dann der statischen Eigenschaft ein Wert zugewiesen. Dabei kann dann auf das Schlüsselwort ''extern'' verzichtet werden, das Schlüsselwort ''const'' muss aber beibehalten werden:
NSString * const kFooBar = @"SomeConstantValue";
Quelle: [[http://stackoverflow.com/a/17228508|Stack Overflow: What is the best way to create constants in Objective-C?]]
===== Zahlen =====
==== Literal ====
Mit dem Prefix ''@'' kann ein ''NSNumber''-Objekt direkt mit Zahl oder sogar mit einem String initialisiert werden:
NSNumber *number = @42;
Quelle: [[http://clang.llvm.org/docs/ObjectiveCLiterals.html|Clang 3.7: Objective-C Literals]]
==== String zu Zahl ====
Um ein String als Zahl verwenden zu können, muss der String mittels des ''NSNumberFormatters'' in eine Zahl vom Typ ''NSNumber'' umgewandelt werden:
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
numberFormatter.numberStyle = NSNumberFormatterDecimalStyle;
NSNumber *foo = [numberFormatter numberFromString:@"42"];
Quelle: [[http://stackoverflow.com/questions/1448804/how-to-convert-an-nsstring-into-an-nsnumber|Stack Overflow: How to convert an NSString into an NSNumber]]
===== Strings =====
==== Formatieren ====
[[https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Strings/Articles/formatSpecifiers.html#//apple_ref/doc/uid/TP40004265-SW1|String Format Specifiers]]
==== Teile in einem String ersetzten ====
Um Teile in einem String zu ersetzen gibt es in jedem Objekt der Klasse ''NSObject'' die Methode ''stringByReplacingOccurrencesOfString:withString:'':
NSString *foo = @"Hello World";
NSString *bar = [foo stringByReplacingOccurrencesOfString:@"World" withString:@"Sky"];
// Hello Sky
Quelle: [[http://stackoverflow.com/a/3613887|Stack Overflow: Replace a substring with another substring]]
===== Arrays =====
Definition eines Arrays als "Literal", mit zwei String-Werten:
NSArray *foobar = @[@"foo", @"bar"];
==== Durch ein Array mit einem Block iterieren ====
NSArray *foo = [NSArray arrayWithObjects:@"foo", @"bar", @"foobar", nil];
[foo enumerateObjectsUsingBlock:^(id value, NSUInteger index, BOOL *stop) {
NSLog(@"%lu: %@", index, value);
}];
==== NSSet in NSArray/NSMutableArray ====
NSSet *foo = [[NSSet alloc] init]
// ...
NSMutableArray *foobar = [NSMutableArray arrayWithArray[foo allObjects]];
// Alternative:
NSMutableArray *barfoo = [[foo allObjects] mutableCopy];
===== NSDictionary =====
==== NSDictionary in NSData konvertieren ====
NSData *fooData = [NSKeyedArchiver archivedDataWithRootObject:fooDictionary];
==== NSData in NSDictionary konvertieren ====
NSDictionary *fooDictionary = (NSDictionary *)[NSKeyedUnarchiver unarchiveObjectWithData:fooData];
===== Datum/Uhrzeit =====
==== Aktuelles Datum und Uhrzeit ====
Das aktuelle Datum die aktuelle Uhrzeit liefert die [[objc:start#klassen-methoden|Klassen-Methode]] ''date'' der Klasse ''NSDate'':
NSDate *now = [NSDate date]
==== Daten vergleichen ====
Daten lassen sich am besten über die Methode ''compare:'' der Klasse ''NSDate'' vergleichen:
if ( [date1 compare:date2] == NSOrderedSame ) {
// date1 and date2 are the same
}
if ( [date1 compare:date2] == NSOrderedDescending ) {
// date1 is after/later than date2
}
if ( [date1 compare:date2] == NSOrderedAscending ) {
// date1 is before/earlier than date2
}
Details in der [[https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSDate_Class/index.html#//apple_ref/occ/instm/NSDate/compare:|Dokumentation von NSDate]].
Quelle: [[http://stackoverflow.com/a/5965106|Stack Overflow: How to compare two NSDates: which is more recent?]]
===== Timer =====
[[https://developer.apple.com/library/ios/documentation/cocoa/reference/foundation/classes/NSTimer_Class/Reference/NSTimer.html|NSTimer Class Reference]]
===== NSPredicate =====
Mit ''NSPredicate'' können Daten-Sätze in Arrays oder Sets oder aus [[apple:coredata:start|Core Data]] nach Vorgaben gefiltert werden.
* [[http://nshipster.com/nspredicate/|NSHipster: NSPredicate]]\\ Eine gute Übersicht über die Verwendung von NSPredicate mit Syntax in [[objc:start|Objective-C]] und [[swift:start|Swift]].