我们知道在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")

以上代码有几点需要注意:

  1. 我没有直接使用NSString和NSRange,它们都是由String和Range转换而来,为什么?因为这里有坑啊!稍后马上会说明.
  2. 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的一个不同之处的更多相关文章

  1. Swift 中 String 取下标及性能问题

    Swift 中 String 取下标及性能问题 取下标 String String 用 String.Index 取下标(subscript)得到 Character,String.Index 要从 ...

  2. Swift 中 String 与 CChar 数组的转换

    在现阶段Swift的编码中,我们还是有很多场景需要调用一些C函数.在Swift与C的混编中,经常遇到的一个问题就是需要在两者中互相转换字符串.在C语言中,字符串通常是用一个char数组来表示,在Swi ...

  3. swift 中String常用操作

    1.  字符串定义 var s = "aaaaaa" // 两个字符串均为空并等价. var emptyString = ""   var anotherEmp ...

  4. swift 中String,Int 等类型使用注意,整理中

    swfit中的String和Int是 struct定义的,不同于NSString和NSNumber, 如果想在一个数组中同时包含String和Int,那么这个数组要声明为[Any] 而不是 [AnyO ...

  5. Swift中String与NSDate的互相转换

    其实每种编程语言,我都觉得String和日期对象的相互转换是一种十分麻烦的事情,Swift也不例外.这篇博客记录了我学到的String与NSDate的互相转换方法,供大家参考. 从String转为NS ...

  6. swift中Any,AnyObject,AnyClass的区别

    这几个概念让人很迷惑,看了很多帖子,终于搞明白了,简单总结: Any 和 AnyObject 是 Swift 中两个妥协的产物.什么意思呢,oc中有个id关键字,表示任何对象,oc和swift混编的时 ...

  7. Swift基础--Swift中的分类以及在分类中扩展init方法的注意事项

    Swift中的分类 1.创建一个空的swift文件 2.关键字extension,格式: extension 要扩展的类名 {} extension UIButton { } Swift中扩展init ...

  8. 《Swift Programming Language 》——Swift中怎样使用继承(Inheritance)

    一个类能够继承(inherit)还有一个类的方法(methods),属性(property)和其他特性.当一个类继承其他类时,继承类叫子类(subclass),被继承类叫超类(或父类,supercla ...

  9. Swift中实现ruby中字符串乘法倍增的功能

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 我们知道在ruby中对于字符串类型我们可以用乘法生成一个指定数 ...

随机推荐

  1. ProxySQL 读写分离实践

    前言 ProxySQL是一个高性能的MySQL中间件,拥有强大的规则引擎.具有以下特性: 连接池,而且是 multiplexing 主机和用户的最大连接数限制 自动下线后端DB 延迟超过阀值 ping ...

  2. vue 插值,v-once,v-text, v-html

    引入Vue.js ,通过script形式,vue官网语法记录 创建vue应用,数据和 DOM 已经被建立了关联,所有东西都是响应式的 1:插值 缺点:让你的网速慢,或者数据加载失败时,会在浏览器中直接 ...

  3. 解决有关flask-socketio中服务端和客户端回调函数callback参数的问题(全网最全)

    由于工作当中需要用的flask_socketio,所以自己学习了一下如何使用,查阅了有关文档,当看到回调函数callback的时候,发现文档里都描述的不太清楚,最后终于琢磨出来了,分享给有需要的朋友 ...

  4. [Luogu 1410]子序列

    Description 给定一个长度为N(N为偶数)的序列,问能否将其划分为两个长度为N/2的严格递增子序列, Input 若干行,每行表示一组数据.对于每组数据,首先输入一个整数N,表示序列的长度. ...

  5. [HNOI 2001]产品加工

    Description 某加工厂有A.B两台机器,来加工的产品可以由其中任何一台机器完成,或者两台机器共同完成.由于受到机器性能和产品特性的限制,不同的机器加工同一产品所需的时间会不同,若同时由两台机 ...

  6. ●BZOJ 1396 识别子串

    题链: http://www.joyoi.cn/problem/tyvj-2301(非权限OI患者,苟且在joyoi...)题解: 后缀自动机,线段树 先对原串建立后缀自动机,不难发现, 会影响答案是 ...

  7. Codeforces Round #438 B. Race Against Time

    Description Have you ever tried to explain to the coordinator, why it is eight hours to the contest ...

  8. 【CodeVs 6128 Lence的方块们】

    ·希望除了内部人员以外能有人通过这道题,因为这是大米饼第一次改编的题 ·我所见到的"本题原版"的题解也很少,搜索一下应该是: #include<stdio.h> #in ...

  9. Nginx+uWSGI+Django环境配置

    通常项目会部署在虚拟环境,虚拟环境的使用可以参考这里,点击前往 当然你也可以直接部署,这里不多说. 一.安装uWSGI 1.通过pip安装 pip install uwsgi 这里只说明了一种安装方式 ...

  10. Python作业之工资管理

    作业之工资管理 工资管理实现要求: 工资管理系统 Alex 100000 Rain 80000 Egon 50000 Yuan 30000 -----以上是info.txt文件----- 实现效果: ...