歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 當C++遇到iOS應用開發---字符串處理

當C++遇到iOS應用開發---字符串處理

日期:2017/3/1 10:07:36   编辑:Linux編程

在Object-c中,字符串處理通常使用NSString,NSMutableString這兩個類,前者用於定長字符串,後者用於可變長度字符串的操作。盡量其提供的方法很豐富,但一用起來後就讓人感到很難受,比如其超長的方法名稱(如stringByReplacingPercentEscapesUsingEncoding),再加上嵌套“[]”式的調用方式,讓人很快就會產生"[]"匹配綜合症。

即使xcode提供了自動配對“[]”號的功能,但一閱讀起源代碼後依舊讓人心生厭惡。給人一種“強迫打字綜合症”的感覺。所以我在NSMutableString基礎上用C++進行了封裝,特別是對於一些常用方法的使用,在使用時會非常方便,與C#沒太大差別。

首先看一下String類的源碼(說明:因為C++中有std::string這個類,為了與其區別,這裡使用了首字母大寫)。

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