热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd

在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. }; 

推荐阅读
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • Final关键字的含义及用法详解
    本文详细介绍了Java中final关键字的含义和用法。final关键字可以修饰非抽象类、非抽象类成员方法和变量。final类不能被继承,final类中的方法默认是final的。final方法不能被子类的方法覆盖,但可以被继承。final成员变量表示常量,只能被赋值一次,赋值后值不再改变。文章还讨论了final类和final方法的应用场景,以及使用final方法的两个原因:锁定方法防止修改和提高执行效率。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
author-avatar
星仔star-powerbz
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有