NSString和SwiftString的区别和使用场景
当下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 + strB
println(strA)
在swift最开始的语法是允许字符串和字符之间 直接使用 “+” 拼接的,但是swift1.2以后就不能这么做了,字符串与字符直接只能用append衔接了。
SwiftString 可以实现字符串遍历
SwiftString 可以实现遍历输出一个字符串内部的所有字符,这是NSString所做不到的,因为前者继承了CollectionType协议(swift2后不再继承此协议,改成通过一个characters属性来提供一个字符的集合)
// swift1.2
for charater in "My name is dsx" {
println(charater)
} // swift2.0
for 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)) // 5
print(strA.characters.count)) // 3
print(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的区别和使用场景的更多相关文章
- list set map区别及适用场景
list与Set.Map区别及适用场景 1.List,Set都是继承自Collection接口,Map则不是 2.List特点:元素有放入顺序,元素可重复 ,Set特点:元素无放入顺序,元素不可重 ...
- session,cookie,sessionStorage,localStorage的区别及应用场景
session,cookie,sessionStorage,localStorage的区别及应用场景 浏览器的缓存机制提供了可以将用户数据存储在客户端上的方式,可以利用cookie,session等跟 ...
- Java内存的 静态方法和实例方法的区别及使用场景
注意:变量指基本数据类型非对象,局部变量不能被静态修饰 1.(静态)成员变量存放在data segment区(数据区),字符串常量也存放在该区 2.非静态变量,new出来的对象存放在堆内存,所有局部变 ...
- 【转】ArrayList与LinkedList的区别和适用场景
ArrayList 优点:ArrayList是实现了基于动态数组的数据结构,因为地址连续,一旦数据存储好了,查询操作效率会比较高(在内存里是连着放的). 缺点:因为地址连续,当要插入和删除时,Arra ...
- 转载>>C# Invoke和BeginInvoke区别和使用场景
转载>>C# Invoke和BeginInvoke区别和使用场景 一.为什么Control类提供了Invoke和BeginInvoke机制? 关于这个问题的最主要的原因已经是dotnet程 ...
- java 常用集合list与Set、Map区别及适用场景总结
转载请备注出自于:http://blog.csdn.net/qq_22118507/article/details/51576319 list与Set.Map区别及 ...
- hibernate与mybatis的区别和应用场景
mybatis 与 hibernate 的区别和应用场景(转) 1 Hibernate : 标准的ORM(对象关系映射) 框架: 不要用写sql, sql 自动语句生成: 使用Hibernate ...
- mybatis由浅入深day01_ 4.11总结(parameterType_resultType_#{}和${}_selectOne和selectList_mybatis和hibernate本质区别和应用场景)
4.11 总结 4.11.1 parameterType 在映射文件中通过parameterType指定输入参数的类型.mybatis通过ognl从输入对象中获取参数值拼接在sql中. 4.11.2 ...
- 为什么要使用索引?-Innodb与Myisam引擎的区别与应用场景
Innodb与Myisam引擎的区别与应用场景 http://www.cnblogs.com/changna1314/p/6878900.html https://www.cnblogs.com/ho ...
随机推荐
- Android数据库表的创建和数据升级操作
之前的文章有提到,可以在xml文件中配置数据库信息:http://www.cnblogs.com/wenjiang/p/4492303.html,现在就讲如何利用这些信息类构建数据库. xml文件大概 ...
- JS魔法堂:函数节流(throttle)与函数去抖(debounce)
一.前言 以下场景往往由于事件频繁被触发,因而频繁执行DOM操作.资源加载等重行为,导致UI停顿甚至浏览器崩溃. 1. window对象的resize.scroll事件 2. 拖拽时的mousemov ...
- MVVM-Sidekick 之SendToEventRouterAction使用
在WP开发中点击列表项跳转到详情页是一个很常用的功能,但是有可能项模板中还有其他的区域,比如点击标题跳转到详情页,点击"赞"图标送一个赞,点击"踩"图标踩一下, ...
- javascript日期验证:填写的日期大于等于当前日期
<script> $(function () { var d = new Date(); var strDate = getDateStr(d); $("#beginTime&q ...
- LeetCode5:Longest Palindromic Substring
题目: Given a string S, find the longest palindromic substring in S. You may assume that the maximum l ...
- jquery简单原则器(匹配除了指定选择器之外的元素 selector 表示选择器)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Maximum length of a table name in MySQL
http://dev.mysql.com/doc/refman/5.7/en/identifiers.html The following table describes the maximum le ...
- Netbeans 8.2将支持PHP 7
首先,将PHP项目的PHP版本设置为PHP 7.0. PHP 7其中一项新特性是返回类型声明,即PHP的函数和方法可以声明指定类型的返回值: PHP 7的另一项精彩的改进就是参数的标量类型声明,Net ...
- mybaits注解
基本的增删改 @Insert("insert into t_user values(null,#{username},#{password},#{account})") @Dele ...
- 【Linux_Fedora_系统管理系列】_1_用户登录和系统初始配置
发现一个问题,在FC14 的Firefox浏览器中,编辑和排版好的博文,在windows下用chrome或者猎豹浏览器打开后,排版就变得阅读 不是很容易里,而且经常不经意的断行.不知道园子的管理人员时 ...