====== 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]].