2016-06-09 6 views
3

In Objective C gibt es eine Möglichkeit zum Formatieren einer Zeichenfolge ähnlich python'sstr.format Methode. Ich möchte in der Lage sein, eine Zeichenfolge mit Schlüsselwörtern @"this is {keyword_1}, and this is {keyword_2}" zu nehmen und diese Schlüsselwörter zu ersetzen, die ein Wörterbuch @{@"keyword_2": @"bar", @"keyword_1": @"foo"} verwenden, resultierend in einer neuen Zeichenfolge @"this is foo, and this is bar".Objective-C String Format nach Schlüsselwort

In Objective C, könnte dies wie folgt aussehen:

[NSString stringWithKeywordFormat:@"hello {user_name}, today is {day_of_week}!" keywords:@{@"user_name":@"Jack", @"day_of_week":@"Thursday"}]; 
+1

Es gibt nichts wie diese eingebaut. Die Template-Bibliothek [GRMustache] (https://github.com/groue/GRMustache) scheint etwas ähnliches zu implementieren (wurde aber nie selbst verwendet). – omz

+0

@omz. Danke für den Zeiger. Ich werde es mir ansehen. –

Antwort

2

Es ist ziemlich einfach, eine solche Funktion zu schreiben, die NSScanner-Klasse verwendet, um die Formatzeichenfolge zu analysieren.

Deklarieren Sie eine Kategorie auf NSString in einer .h-Datei:

#import <Foundation/Foundation.h> 

@interface NSString (KeywordFormat) 
+ (NSString *)stringWithKeywordFormat:(NSString *)format keywords:(NSDictionary *)dictionary; 
@end 

Die Umsetzung in der .m-Datei sieht wie folgt aus

#import "NSString+KeywordFormat.h" 

@implementation NSString (KeywordFormat) 

+ (NSString *)stringWithKeywordFormat:(NSString *)format keywords:(NSDictionary *)dictionary 
{ 
    NSMutableString *result = [NSMutableString string]; 

    NSScanner *scanner = [NSScanner scannerWithString:format]; 
    [scanner setCharactersToBeSkipped:nil]; 

    NSString *temp; 
    while (![scanner isAtEnd]) 
    { 
     // copy characters to the result string until a { is found 
     if ([scanner scanUpToString:@"{" intoString:&temp]) 
      [result appendString:temp]; 
     if ([scanner isAtEnd]) 
      break; 

     // swallow the { character 
     if (![scanner scanString:@"{" intoString:NULL]) 
      break; 
     if ([scanner isAtEnd]) 
      break; 

     // get the keyword 
     if (![scanner scanUpToString:@"}" intoString:&temp]) 
      break; 
     if ([scanner isAtEnd]) 
      break; 

     // swallow the } character 
     if (![scanner scanString:@"}" intoString:NULL]) 
      break; 

     // lookup the keyword in the dictionary, and output the value 
     [result appendFormat:@"%@", dictionary[temp]]; 
    } 

    return([result copy]); 
} 

@end 
+0

Es sollte wahrscheinlich eine Möglichkeit geben, ein Literal '{' in der Zeichenfolge zu haben, das nicht den Anfang einer Variablen darstellt. – rmaddy

+1

@rmaddy Einverstanden. Ich beschloss, diesen Teil als eine Übung für den Leser zu verlassen. – user3386109

0

nicht im Standard-First-Party-Apple-Bibliotheken, Nr. Ich habe auch noch nie etwas in einer Drittanbieter-Bibliothek gesehen.