Swift中String和NSString的一个不同之处
我们知道在Swift中String和NSString是可以互相转换使用的…额…应该是在绝大数情况下可以互相转换使用.在某些情况下可能还有一丝丝略微的差别:比如在涉及到处理字符串中字符索引的时候.
我们首先来看一下NSString的字符串替换功能:
let string = "ABCDE"
let range = Range(uncheckedBounds: (1,4))
let nsRange = NSRange(range)
let str:NSString = NSString(string: string)
str.replacingCharacters(in: nsRange, with: "AAAA")
以上代码有几点需要注意:
- 我没有直接使用NSString和NSRange,它们都是由String和Range转换而来,为什么?因为这里有坑啊!稍后马上会说明.
- Range的初始化器里的参数是一个tuple,所以额外有一层括号,如果你直接传2个参数进去就会出错了.
各位来猜一下上面的代码最后一句的结果是神马!?如果你认为是”AAAAA”,那么恭喜你,猜错了!!!实际的结果是”AAAAAE”.你没看错!
你实际生成的Range为(1..<4)其中只有3个空间,即为BCD3个字符,你需要替换为”AAAA”,所以最后的结果为”AAAAAE”,如果你想结果为”AAAAA”,你只需要第二句改为:
let range = Range(uncheckedBounds: (1,5))
即可.你也可以直接创建NSRange:
let nsRange = NSMakeRange(1, 4)
这样创建的是我们所需要的结果.
下面我们看一下上面相同的功能在String里又该如何写呢?
我们先尝试一下:
let string = "ABCDE"
let range = Range(uncheckedBounds: (1,4))
string.replacingCharacters(in: range, with: "AAAA")
不出意外,编译器抱怨了!正如小琥那首歌—没.那.么.简.单…
看一下错误信息,原来两种范围类型不可以互相转换的,正确的写法如下:
let idx1 = string.characters.index(after: string.startIndex)
let idxRange = idx1..<string.characters.index(idx1, offsetBy: 4)
string.replacingCharacters(in: idxRange, with: "AAAA")
超复杂的,有木有… ;)
原来低版本Swift中的startIndex.successor()和advance()方法都以废弃,所以在Swift3.0中你只有按如上方式来写了.最后把老版本Swift中的写法贴出来:
let string = "ABCDE"
let nsRange = NSMakeRange(1, 4)
string.stringByReplacingCharactersInRange(nsRange, withString: "AAAA")
let indexPositionOne = string.startIndex.successor()
let swiftRange = indexPositionOne..<advance(indexPositionOne, 4)
string.stringByReplacingCharactersInRange(swiftRange, withString: "AAAA")
注意:以上代码不能用在Swift3.0中!
Swift中String和NSString的一个不同之处的更多相关文章
- Swift 中 String 取下标及性能问题
Swift 中 String 取下标及性能问题 取下标 String String 用 String.Index 取下标(subscript)得到 Character,String.Index 要从 ...
- Swift 中 String 与 CChar 数组的转换
在现阶段Swift的编码中,我们还是有很多场景需要调用一些C函数.在Swift与C的混编中,经常遇到的一个问题就是需要在两者中互相转换字符串.在C语言中,字符串通常是用一个char数组来表示,在Swi ...
- swift 中String常用操作
1. 字符串定义 var s = "aaaaaa" // 两个字符串均为空并等价. var emptyString = "" var anotherEmp ...
- swift 中String,Int 等类型使用注意,整理中
swfit中的String和Int是 struct定义的,不同于NSString和NSNumber, 如果想在一个数组中同时包含String和Int,那么这个数组要声明为[Any] 而不是 [AnyO ...
- Swift中String与NSDate的互相转换
其实每种编程语言,我都觉得String和日期对象的相互转换是一种十分麻烦的事情,Swift也不例外.这篇博客记录了我学到的String与NSDate的互相转换方法,供大家参考. 从String转为NS ...
- swift中Any,AnyObject,AnyClass的区别
这几个概念让人很迷惑,看了很多帖子,终于搞明白了,简单总结: Any 和 AnyObject 是 Swift 中两个妥协的产物.什么意思呢,oc中有个id关键字,表示任何对象,oc和swift混编的时 ...
- Swift基础--Swift中的分类以及在分类中扩展init方法的注意事项
Swift中的分类 1.创建一个空的swift文件 2.关键字extension,格式: extension 要扩展的类名 {} extension UIButton { } Swift中扩展init ...
- 《Swift Programming Language 》——Swift中怎样使用继承(Inheritance)
一个类能够继承(inherit)还有一个类的方法(methods),属性(property)和其他特性.当一个类继承其他类时,继承类叫子类(subclass),被继承类叫超类(或父类,supercla ...
- Swift中实现ruby中字符串乘法倍增的功能
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 我们知道在ruby中对于字符串类型我们可以用乘法生成一个指定数 ...
随机推荐
- [python]_ELVE_pip2和pip3如何共存
作者:匿名用户链接:https://www.zhihu.com/question/21653286/answer/95532074来源:知乎著作权归作者所有,转载请联系作者获得授权. 想学习Pytho ...
- echarts版本折线图
1.效果如下: 绘制折线图,应该算是说echarts中使用最简单也算使用频率最高的一种功能了吧.根据官网列子能找出规律,只是有些属性对于初接触者来说,会有点陌生,不过仔细阅读一下还是不 ...
- 从零开始系列之vue全家桶(2)安装调试插件vue Devtools
小白安装前提是会用git,会从github上找东西. 第一步: 我们可以先从github上找到vue-devtools的项目,下载到本地.下载vue-devtools链接. 克隆方法:git clon ...
- 基于线程池的多线程售票demo(原创)
废话不多说,直接就开撸import org.springframework.util.StopWatch;import java.util.concurrent.*;/** * 基于线程池实现的多线程 ...
- luogu 3413 SAC#1 - 萌数
题目描述 辣鸡蒟蒻SOL是一个傻逼,他居然觉得数很萌! 好在在他眼里,并不是所有数都是萌的.只有满足“存在长度至少为2的回文子串”的数是萌的——也就是说,101是萌的,因为101本身就是一个回文数:1 ...
- [ZJOI2006]物流运输 SPFA+DP
题目描述 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格的管理和跟踪. ...
- POJ 3045 Cow Acrobats
Description Farmer John's N (1 <= N <= 50,000) cows (numbered 1..N) are planning to run away a ...
- bzoj3126[Usaco2013 Open]Photo 单调队列优化dp
3126: [Usaco2013 Open]Photo Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 374 Solved: 188[Submit] ...
- Mysql 基于GTID的主从复制(实操)
实现环境: Master 主:192.168.0.102 (Mysql 5.6.36) Slave 从 :192.168.0.103 (Mysql 5.6.36) 步骤1.在主DB服务器上建立复制账 ...
- 关于jsp中的文件下载
第一种采用转发的方式: package cn.jbit.download.servlet; import java.io.IOException; import javax.servlet.Reque ...