[IOS]Swift字符串截取方法的改进

//转载http://blog.csdn.net/duzixi/article/details/36935573

字符串截取方法是字符串处理中常用的基本方法。熟悉iOS的朋友都知道在基础类的NSString中有substringToIndex:,substringFromIndex:以及substringWithRange:这三种基本的截取方法。


问题描述:

那么,Swift语言中的String类是否有同样的截取功能呢?

反复查看String类的头文件,并没有找到相同或相似的函数接口。

直接在swift文件里也不能对一个String类的变量调用上面的方法。

然而通过引入基础框架,即

[javascript]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. import Foundation  

就可以使用前两个截取方法了:

[javascript]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /* 字符串截取 */  
  2. var str:String = "Hello, World!"  
  3. println(str.substringToIndex(3))  
  4. println(str.substringFromIndex(3))  

然而,奇怪的是第三种方法却怎么也用不了。无论是这样创建范围:

[javascript]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. var r:NSRange = NSMakeRange(1,2)  


还是这样创建范围:

[javascript]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. var r = NSRange(location: 1,length: 2)  


调用substringWithRange() 函数总是语法有误:

[javascript]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. var str1:String = str.substringWithRange(r) //语法有误!  

错误提示是:Cannot convert the expression's type 'String' to type 'Range<String.Index>'


可见是参数类型不符合,不大了解Range<String.Index>这个类型到底能怎么搞出来,但是给出以下两种解决方案。


解决方案:


解决方案(一):把String类的变量转存为NSString类型

[javascript]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. var nsString: NSString = str  
  2. println(nsString.substringWithRange(r))  


当然这个方案有点赖,实质上已经不是String类的截取而是NSString类的截取了。而且每个String类的都要转一下子,如果字符串一多,就略显麻烦。

有没有其它方法解决这个问题呢?下面给出第二个解决方案。


解决方案(二):对String类进行扩展,重载substringWithRange()

[javascript]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. extension String {  
  2.     func substringWithRange(range: NSRange) -> String! {  
  3.         var str1 = self.substringFromIndex(range.location)  
  4.         var str2 = str1.substringToIndex(range.length)  
  5.         return str2  
  6.     }  
  7. }  

有了这个扩展,就可以按照NSString的方式来截取字符串啦!


完整演示代码:

[javascript]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //  
  2. //  main.swift  
  3. //  Swift中字符串的截取方法  
  4. //  
  5. //  Created by 杜子兮 on 14-7-4.  
  6. //  Copyright (c) 2014年 lanou3g.com 蓝鸥 All rights reserved.  
  7. //  
  8.   
  9. var str:String = "Hello, World!"  
  10.   
  11. /* import Foundation之前,子串截取方法不能使用 */  
  12. // println(str.substringToIndex(3))    //error  
  13. // println(str.substringFromIndex(3))  //error  
  14.   
  15. import Foundation  
  16.   
  17. /* import Foundation之后,下面这两个函数可以直接使用 */  
  18. println(str.substringToIndex(3))  
  19. println(str.substringFromIndex(3))  
  20.   
  21. var r:NSRange = NSMakeRange(3,5)  
  22.   
  23. /* String类的变量不能直接这样取中间子串 */  
  24. // println(str.substringWithRange(r))  //error  
  25.   
  26. // 解决方案(一):转换为NSString类的  
  27. var nsString: NSString = str  
  28. println(nsString.substringWithRange(r))  
  29.   
  30. // 解决方案(二):扩展String类  
  31. extension String {  
  32.     func substringWithRange(range: NSRange) -> String! {  
  33.         var str1 = self.substringFromIndex(range.location)  
  34.         var str2 = str1.substringToIndex(range.length)  
  35.         return str2  
  36.     }  
  37. }  
  38. println(str.substringWithRange(r))  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值