当下Swift项目已经越来越多,可能会经常见到  str as NSString 或者 str as String 字符串在这两者之间的来回切换,因为有些操作用OC字符串比较方便,而有些操作则相反,熟练掌握这两种字符串的特点对项目的开发必然有利。本文是一些自己的理解,借鉴了官方文档,如有理解偏差之处也欢迎指点。

如果你不是在董铂然博客园看到本文,请点击查看原文。

首先说下共同点,就是String保留了大部分NSString的api比如

.hasPrefix

.lowercaseString

.componentsSeparatedByString

.substringWithRange 等等

所以很多常规操作在开发中使用两者之一都是可以的,下面说下区别。

NSString是引用类型。SwiftString是值类型。

        var nsString:NSString = NSString()var swiftString:String = String()var nsString:NSString = "dsx"var swiftString:String = "dsx"

两者都可以使用自己的类名来直接进行初始化,下面的方法也是初始化,虽然写法相同,但是NSString的意思是初始化了一个指针指向了这个字符串,但SwiftString的意思则是把字符串字面量赋值给变量。

SwiftString字符串之间的拼接比NSString方便

NSString需要用append或者stringWithFormat将两个字符串拼接

        NSString *strA = @"My name";NSString *strB = @" is dsx";strA = [strA stringByAppendingString:strB];

而SwiftString只需要用 “+” 即可

        var strA = "My name"var strB = " is dsx"strA = "My name" + " is dsx"strA = strA + strBprintln(strA)

在swift最开始的语法是允许字符串和字符之间 直接使用 “+” 拼接的,但是swift1.2以后就不能这么做了,字符串与字符直接只能用append衔接了。

SwiftString 可以实现字符串遍历

SwiftString 可以实现遍历输出一个字符串内部的所有字符,这是NSString所做不到的,因为前者继承了CollectionType协议(swift2后不再继承此协议,改成通过一个characters属性来提供一个字符的集合)

        // swift1.2for charater in "My name is dsx" {println(charater)}// swift2.0for character in "My name is dsx".characters {print(character)}

swift的字符串更像是多个字符元素组合而成有序列的一个产物,像但不是集合类;如果把上面的“This is a book” 后面加上 as NSString  则会报如下错误:

Type 'NSString' does not conform to protocol 'SequenceType'

在swift2.0以后写as String 也会报上面错误,2.0将原来String继承的SequenceType和CollectionType协议都下沉到了String.CharacterView来继承,感觉苹果这么做的目的是为了减少资源浪费。

SwiftString计算字符串长度的方法与NSString不同

        var strA:String = "mc梦"var strB:NSString = "mc梦"print(strA.lengthOfBytesUsingEncoding(NSUTF8StringEncoding)) // 5print(strA.characters.count)) // 3print(strB.length); // 3

NSString直接使用 字符串.length 就可以获得字符串的长度,但是String敲.length只能敲出 .lengthOfBytesUsingEncoding(NSUTF8StringEncoding) 这么算汉字的存储空间就是英文的3倍。 swift真正的类似于.lengh的方法就是取出characters属性(数组)然后.count

SwiftString比较字符串相等的方式与NSString不同

        let strA:NSString = ""let strB:NSString = ""let strC:NSString = "dsx"let strD:NSString = "dsx"if(strA.isEqualToString(strB as String)){print("yes");}if (strC == strD){print("yes");}

NSString 有一个方法isEqualToString 方法用来判断两个字符串是否完全相等,String没有这个方法,但是因为String是值类型所以可以直接用 == 判断是否完全相等。

NSString可以同基本数据类型见转化

        var strA:NSString = "12306"var strB:NSString = "0.618"var numOfInt = strA.integerValue;var numOfDouble = strB.doubleValue;

这个功能Swift没有,所以在json解析或字典转模型时可能会使用NSString比较方便。

SwiftString可以通过isEmpty属性来判断该字符串是否为空

        var emptyStr = ""if emptyStr.isEmpty {print("It is empty")}

这个也是swiftString独有的一个属性。(董铂然)一般NSString想判断字符串是否为空都是需要看.length是否>0。 判断NSString == nil 这个方法现在已经不让用了,会报错

Binary operator '==' cannot be applied to operands of type 'NSString' and 'NilLiteralConvertible'

SwiftString独有的字符串插入字符功能

        var strA:String = "My name is dx"strA.insert("s", atIndex: strA.characters.indexOf("x")!);print(strA) // My name is dsx

这个方法仅仅可以插入单个字符不能插字符串,如果里面写成"ss" 就会报错 Cannot convert value of type 'String' to expected argument type 'Character'

如果你不是在董铂然博客园看到本文,请点击查看原文。

NSString是一个指针不能进行此操作。并且String也拥有NSString的subStringFromIndex 或 ToIndex的功能。

总结:

String的总体功能来看还是比NSString要更加强大,毕竟Swift语法里的正规军。两者有很多的不同,甚至他有你没有的功能说到底都是一个是值类型,一个是引用类型引起的。swift2.0之后扩展了一些属性,这也让String的很多方法的调用方式发生了巨大改变。 还有一些不同正在探索中,希望本文能对读者有所帮助,转载必须注明转载和原文链接。

NSString和SwiftString的区别和使用场景相关推荐

  1. hibernate与mybatis的区别和应用场景

    mybatis 与 hibernate 的区别和应用场景(转) 1    Hibernate : 标准的ORM(对象关系映射) 框架: 不要用写sql, sql 自动语句生成: 使用Hibernate ...

  2. 数组和链表的区别以及应用场景

    数组和链表的区别以及应用场景 首先我们要先理解什么是数组和链表 在计算机中要对给定的数据集进行若干处理,首要任务是把数据集的一部分(当数据量非常大时,可能只能一部分一部分地读取数据到内存中来处理)或全 ...

  3. spring中基于Java容器配置注解的区别及使用场景

    转载自百家号作者:有趣的代码 @Component.@Service.@Controller.@Repository:@Configuration.@Bean区别,使用场景 从spring3.0开始, ...

  4. php使用hset报错,redis中set和hset的区别和使用场景

    下面由redis教程栏目给大家介绍redis中set和hset的区别和使用场景,希望对需要的朋友有所帮助! redis中存数据时,到底什么时候用 hset 相比于 set 存数据时又有什么不一样? s ...

  5. python怎么接收udp报文_面试官:说说UDP和TCP的区别及应用场景

    上一篇聊完一文彻底搞懂 TCP三次握手.四次挥手过程及原理 这次聊聊TCP和UDP的区别和场景 TCP/IP 中有两个具有代表性的传输层协议,分别是 TCP 和 UDP.来看看传输层位于OSI七层协议 ...

  6. java 常用集合list与Set、Map区别及适用场景总结

    转载请备注出自于:http://blog.csdn.net/qq_22118507/article/details/51576319   list与Set.Map区别及适用场景 1.List,Set都 ...

  7. Hive常见的存储格式的区别与应用场景

    Hive常见的存储格式的区别与应用场景 一.文件存储格式 行存储和列存储 1.TextFile 2.sequencefile 3.RC 4.orc(工作中常用) 5.parquet 二.四种存储格式分 ...

  8. git reset三种模式区别和使用场景(hard,soft,mixed)

    简单的理解三种模式: hard reset之后,以仓库为准,仓库,暂存区和工作区保持一致,不一致的全部清除: soft reset之后,工作区内容不变,只更新仓库内容,差异保留在index暂存区: m ...

  9. 正则项的原理、梯度公式、L1正则化和L2正则化的区别、应用场景

    先对"L1正则化和L2正则化的区别.应用场景"给出结论,具体见后面的原理解释: L1正则化会产生更稀疏的解,因此基于L1正则化的学习方法相当于嵌入式的特征选择方法. L2正则化计算 ...

最新文章

  1. Silverlight学习笔记之使用TranslateTransform控制对象位置
  2. Android Bitmap圆角
  3. 微信端图片上传方式2
  4. Leetcode 39 组合总和 (每日一题 20210806)
  5. 内网穿透和内网映射区别是什么?
  6. python 分布式框架_python分布式框架rq的使用
  7. ajax 入参为list_ajax向后台传入List
  8. android简单课表,模仿大神的一个android课程表
  9. hp chromebook11 linux,又有18款Chromebook即将支持Linux应用
  10. 李洪强iOS之集成极光推送二iOS 证书 设置指南
  11. 有哪些可以让人清醒的创业失败故事
  12. 【Codeforces Round #516_div2_E】【二分交互题】Dwarves, Hats and Extrasensory Abilities
  13. fh 幅频特性曲线怎么画fl_测量rc带通滤波器的幅频特性和相频特性-电子科技大学.ppt...
  14. spring源码系列(五)——番外篇回答网友的问题
  15. sql-update 用法
  16. PS CC2018安装及破解方法
  17. 【转】redis利用姿势收集
  18. HTML基础--标签VSCode常用快捷方式和插件
  19. python办公自动化价值是什么意思_用python进行办公自动化都需要学习什么知识呢?...
  20. 结构体类型的变量的初始化

热门文章

  1. SQL2005实现全文检索的步骤 停止数据库的用户连接
  2. 基于京东手机销售数据用回归决策树预测价格
  3. 搭建基础架构-ResultMsg
  4. Redis中的I/O 多路复用(I/O Multiplexing)
  5. maven依赖管理的概念
  6. ThreadLocal的两种用法
  7. 保存课程图片-服务端开发
  8. (常用API)正则表达式的概念和作用
  9. 发布订阅之fanout
  10. 多租户以及基于多租户的数据库设计需求