当C++遇到iOS应用开发---字符串处理

在Object-c中,字符串处理通常使用NSString,NSMutableString这两个类,前者用于定长字符串,后者用于可变长度字符串的操作。尽量其提供的方法很丰富,但一用起来后就让人感到很难受,比如其超长的方法名称(如stringByReplacingPercentEscapesUsingEncoding),再加上嵌套“[]”式的调用方式,让人很快就会产生"[]"匹配综合症。

即使xcode提供了自动配对“[]”号的功能,但一阅读起源代码后依旧让人心生厌恶。给人一种“强迫打字综合症”的感觉。所以我在NSMutableString基础上用C++进行了封装,特别是对于一些常用方法的使用,在使用时会非常方便,与C#没太大差别。

首先看一下String类的源码(说明:因为C++中有std::string这个类,为了与其区别,这里使用了首字母大写)。

  1. #import "RegexKitLite.h"  
  2.  
  3. #define RELEASE_SAFELY(__POINTER) { [__POINTER release]; __POINTER = nil; }  
  4.  
  5. class String { 
  6. private
  7.      
  8.     NSMutableString *temp; 
  9.      
  10.     static inline NSMutableString* ToMutableString(NSString *str){ 
  11.         return [[NSMutableString stringWithString:(NSString *)str] autorelease]; 
  12.     } 
  13.  
  14. public : 
  15.     String(){ 
  16.         temp = ToMutableString(@""); 
  17.     } 
  18.      
  19.     String(NSString *str){ 
  20.         temp = ToMutableString(str); 
  21.     } 
  22.      
  23.     String(int value){ 
  24.         temp = ToMutableString([NSString stringWithFormat:@"%d", value]); 
  25.     } 
  26.      
  27.     String(float value){ 
  28.         temp = ToMutableString([NSString stringWithFormat:@"%f", value]); 
  29.     } 
  30.      
  31.     String(std::string str){ 
  32.         temp = ToMutableString(toNSString(str)); 
  33.     } 
  34.      
  35.     String(const char* str){ 
  36.         temp = ToMutableString(toNSString(str)); 
  37.     } 
  38.      
  39.     ~String(){ 
  40.         RELEASE_SAFELY(temp); 
  41.     } 
  42.      
  43.     NSString * toString(){ 
  44.         return temp; 
  45.     } 
  46.      
  47.     const std::string toStdString(){ 
  48.         return [temp UTF8String]; 
  49.     } 
  50.      
  51.     NSString * toLower(){ 
  52.         return [temp lowercaseString]; 
  53.     } 
  54.      
  55.     NSString* toUpper(){ 
  56.         return [temp uppercaseString]; 
  57.     } 
  58.      
  59.     int length(){ 
  60.         return temp.length; 
  61.     } 
  62.      
  63.     bool contains(NSString *search){ 
  64.         return [temp rangeOfString:search].location != NSNotFound; 
  65.     } 
  66.      
  67.     //不考虑大小写  
  68.     static BOOL stringEquals(NSString* str1, NSString* str2) 
  69.     { 
  70.         if ( str1 == nil || str2 == nil ) { 
  71.             return NO; 
  72.         } 
  73.         return [str1 compare:str2 options:NSCaseInsensitiveSearch] == NSOrderedSame; 
  74.     } 
  75.      
  76.     //区分大小写  
  77.     static BOOL caseEquals(NSString* str1, NSString* str2) 
  78.     { 
  79.         return (str1 == nil || str2 == nil) ? NO : [str1 isEqualToString:str2]; 
  80.     } 
  81.      
  82.     bool operator==( NSString *str) 
  83.     { 
  84.         return caseEquals(this->toString(), str); 
  85.     } 
  86.      
  87.     bool operator==( String *str) 
  88.     { 
  89.         return caseEquals(this->toString(), str->toString()); 
  90.     } 
  91.      
  92.     //区分大小写  
  93.     BOOL startWith(NSString *prefix){ 
  94.         if ( temp != nil && prefix != nil ){ 
  95.             if ( prefix.length > temp.length ) { 
  96.                 return NO; 
  97.             } 
  98.             if ([temp hasPrefix:prefix]){ 
  99.                 return YES; 
  100.             } 
  101.         } 
  102.         return NO; 
  103.     } 
  104.      
  105.     //区分大小写  
  106.     BOOL endWith(NSString* suffix){ 
  107.         if ( temp != nil && suffix != nil ){ 
  108.             if ( [suffix length] > [temp length] ) { 
  109.                 return NO; 
  110.             } 
  111.             if ([temp hasSuffix:suffix]){ 
  112.                 return YES; 
  113.             } 
  114.         } 
  115.         return NO; 
  116.     } 
  117.    
  118.      
  119.     String& operator=( NSString *str) 
  120.     { 
  121.         temp = ToMutableString(str); 
  122.         return (*this); 
  123.     } 
  124.      
  125.     String& operator=( std::string str) 
  126.     { 
  127.         temp = ToMutableString(toNSString(str)); 
  128.         return (*this); 
  129.     } 
  130.      
  131.     String& operator=( Json::Value value) 
  132.     { 
  133.         temp = ToMutableString(toNSString(value.asString())); 
  134.         return (*this); 
  135.     } 
  136.      
  137.      
  138.     //不区别大小写  
  139.     BOOL isURL(){ 
  140.         if ( [temp length] > 6 ) { 
  141.             NSString* prefix = [temp substringToIndex:6]; 
  142.             if (stringEquals(prefix, @"http:/") || stringEquals(prefix, @"https:") ) { 
  143.                 return YES; 
  144.             } else if (stringEquals(prefix, @"local:")){ 
  145.                 return YES; 
  146.             } 
  147.         } 
  148.         if (startWith(@"/")){ 
  149.             return YES; 
  150.         } 
  151.         return NO; 
  152.     } 
  153.      
  154.     int toInt(){ 
  155.         return [temp intValue]; 
  156.     } 
  157.      
  158.     int toFloat(){ 
  159.         return [temp floatValue]; 
  160.     } 
  161.      
  162.     NSDate* toDate(NSString* fmt){ 
  163.         return stringToDate(temp, fmt); 
  164.     } 
  165.  
  166.      
  167.     NSArray* split(NSString *schar){ 
  168.         return [temp componentsSeparatedByString:schar]; 
  169.     } 
  170.      
  171.     String& trim(){ 
  172.         temp = ToMutableString([temp stringByTrimmingCharactersInSet:                                                          [NSCharacterSet whitespaceAndNewlineCharacterSet]]); 
  173.         return (*this); 
  174.     } 
  175.      
  176.     String& append(NSString *appstr){ 
  177.         [temp appendString:appstr]; 
  178.         return *this
  179.     } 
  180.      
  181.      
  182.     BOOL isEmpty(){ 
  183.         return temp == nil || [temp length] == 0; 
  184.     } 
  185.  
  186.      
  187.     String& appendFormat(NSString* formatStr, ...){ 
  188.         va_list arglist; 
  189.         va_start(arglist, formatStr); 
  190.         id statement = [[NSString alloc] initWithFormat:formatStr arguments:arglist]; 
  191.         va_end(arglist); 
  192.         [temp appendString:statement]; 
  193.         [statement release]; 
  194.         return *this
  195.     } 
  196.      
  197.     String& replace(NSString *oldStr, NSString *newStr){ 
  198.         [temp replaceOccurrencesOfString:oldStr 
  199.                               withString:newStr 
  200.                                  options:0 range:NSMakeRange(0, [temp length])]; 
  201.         return *this
  202.     } 
  203.  
  204.     String& regexReplace(NSString *regex, NSString *newStr){ 
  205.         NSString *tempstr = temp; 
  206.         temp = ToMutableString([tempstr stringByReplacingOccurrencesOfRegex:regex withString:newStr]); 
  207.         return *this
  208.     } 
  209.      
  210.     NSArray* regexMatchs(NSString *regex){ 
  211.         return [temp componentsMatchedByRegex:regex]; 
  212.     } 
  213.  
  214.     NSArray* regexMatchs(NSString *regex, int capture){ 
  215.         return [temp componentsMatchedByRegex:regex capture:capture]; 
  216.     } 
  217.        
  218.     BOOL regexIsMatch(NSString *regex){ 
  219.         return [temp isMatchedByRegex:regex]; 
  220.     } 
  221.  
  222.      
  223.      
  224.     NSString * encodeUrl(){ 
  225.         NSString *resultStr = temp; 
  226.          
  227.         CFStringRef originalString = (CFStringRef) temp; 
  228.         CFStringRef leaveUnescaped = CFSTR(" "); 
  229.         CFStringRef forceEscaped = CFSTR("!*'();:@&=+$,/?%#[]"); 
  230.          
  231.         CFStringRef escapedStr; 
  232.         escapedStr = CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, 
  233.                                                              originalString, 
  234.                                                              leaveUnescaped, 
  235.                                                              forceEscaped, 
  236.                                                              kCFStringEncodingUTF8); 
  237.          
  238.         if(escapedStr) 
  239.         { 
  240.             NSMutableString *mutableStr = [NSMutableString stringWithString:(NSString *)escapedStr]; 
  241.             CFRelease(escapedStr); 
  242.             if (!mutableStr || [mutableStr isKindOfClass:[NSNull class]] || mutableStr.length <= 0) { 
  243.                 return resultStr; 
  244.             } 
  245.              
  246.             // replace spaces with plusses  
  247.             [mutableStr replaceOccurrencesOfString:@" " 
  248.                                         withString:@"%20" 
  249.                                            options:0 
  250.                                              range:NSMakeRange(0, [mutableStr length])]; 
  251.             resultStr = mutableStr; 
  252.         } 
  253.          
  254.         return resultStr; 
  255.     } 
  256.      
  257.     NSString * decodeUrl(){ 
  258.         return [temp stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
  259.     } 
  260.      
  261.     NSString * toGBK(){ 
  262.         NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000); 
  263.         NSData *data = [temp dataUsingEncoding:NSUTF8StringEncoding]; 
  264.         return [[[NSString alloc] initWithData:data encoding:enc] autorelease]; 
  265.     } 
  266.      
  267.     NSString * toUTF8(){ 
  268.         return [DZUtils urlEncode:temp stringEncode:NSUTF8StringEncoding]; 
  269.     } 
  270.      
  271.     NSData * toNSData(){ 
  272.         return [temp dataUsingEncoding:NSUTF8StringEncoding]; 
  273.     } 
  274.    
  275.     NSString* subString(int start/*start from 0*/int count){ 
  276.         if(start + count <= temp.length) 
  277.             return [temp substringWithRange:NSMakeRange(start, count)]; 
  278.         return nil; 
  279.     } 
  280.      
  281.     NSString* subString(int count){ 
  282.         if(count <= temp.length) 
  283.             return [temp substringToIndex: count]; 
  284.         return nil; 
  285.     } 
  286.      
  287.     static NSDate* stringToDate(NSString * string,  NSString* fmt){ 
  288.         NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
  289.         [formatter setTimeZone:[NSTimeZone defaultTimeZone]]; 
  290.         NSString* format = fmt == nil ? @"yyyy-MM-dd'T'HH:mm:ss'Z'" : fmt; 
  291.         [formatter setDateFormat:format]; 
  292.         NSDate *date = [formatter dateFromString:string]; 
  293.         [formatter release]; 
  294.         return date; 
  295.     } 
  296.      
  297.     static NSString* dateToString(NSDate* date, NSString* fmt){ 
  298.         NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
  299.         [formatter setTimeZone:[NSTimeZone defaultTimeZone]]; 
  300.         NSString* format = fmt == nil ? @"yyyy-MM-dd'T'HH:mm:ss'Z'" : fmt; 
  301.         [formatter setDateFormat:format]; 
  302.         NSString* dateStr = [formatter stringFromDate:date]; 
  303.         [formatter release]; 
  304.         return dateStr; 
  305.     } 
  306.      
  307.     static NSString* format(NSString* formatStr, ...){ 
  308.         va_list arglist; 
  309.         va_start(arglist, formatStr); 
  310.         id statement = [[[NSString alloc]  initWithFormat:formatStr arguments:arglist] autorelease]; 
  311.         va_end(arglist); 
  312.         return statement; 
  313.     } 
  314.      
  315.     static NSString* toNSString(std::string str){ 
  316.         return toNSString(str.c_str()); 
  317.     } 
  318.      
  319.     static NSString* toNSString(const char* str){ 
  320.         return [NSString stringWithUTF8String:str]; 
  321.     } 
  322.  
  323.     static NSString* toNSString(Json::Value value){ 
  324.         return toNSString(value.asString()); 
  325.     } 
  326.      
  327.     static String Create(Json::Value value){ 
  328.         String str(toNSString(value)); 
  329.         return str; 
  330.     } 
  331. }; 

c++

相关推荐