当下Swift@H_404_3@项目已经越来越多,可能会经常见到
str as NSString@H_404_3@ 或者
str as String@H_404_3@字符串在这两者之间的来回切换,因为有些操作用OC字符串比较方便,而有些操作则相反,熟练掌握这两种字符串的特点对项目的开发必然有利。本文是一些自己的理解,借鉴了官方文档,如有理解偏差之处也欢迎指点。
NSString和String的共同点
首先说下共同点,就是String保留了大部分NSString的api比如
.hasPrefix
.lowercaseString
.componentsSeparatedByString
.substringWithRange 等等
所以很多常规操作在开发中使用两者之一都是可以的,
NSString和String的共同点的区别
1.NSString@H_404_3@是引用类型。Swift String@H_404_3@是值类型。
- var nsString: NSString = NSString()
- var swiftString:String = String()
- var nsString: NSString = "dsx"
- var swiftString:String = "dsx"
两者都可以使用自己的类名来直接进行初始化,下面的方法也是初始化,虽然写法相同,但是NSString的意思是初始化了一个指针指向了这个字符串,但Swift String的意思则是把字符串字面量赋值给变量。
2. Swift String字符串之间的拼接比NSString方便
2.1 NSString@H_404_3@需要用append@H_404_3@或者stringWithFormat@H_404_3@将两个字符串拼接
- NSString *strA = @"My name";
- NSString *strB = @" is dsx";
- strA = [strA stringByAppendingString: strB];
2.2 而Swift String@H_404_3@只需要用 +@H_404_3@ 即可
- var strA = "My name"
- var strB = " is dsx"
- strA = "My name" + " is dsx"
- strA = strA + strB
- println(strA)
在swift最开始的语法是允许字符串和字符之间 直接使用 “+” 拼接的,但是swift1.2以后就不能这么做了,字符串与字符直接只能用append衔接了。
2.3 Swift String@H_404_3@ 可以实现字符串遍历
SwiftString@H_404_3@ 可以实现遍历输出一个字符串内部的所有字符,这是NSString所做不到的,因为前者继承了CollectionType@H_404_3@协议(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'@H_404_3@
在swift2.0以后写as String 也会报上面错误,2.0将原来String继承的SequenceType和CollectionType协议都下沉到了String.CharacterView来继承,感觉苹果这么做的目的是为了减少资源浪费。
2.4 Swift String计算字符串长度的方法与NSString不同
- var strA: String = "mc梦"
- var strB: NSString = "mc梦"
- print(strA.lengthOfBytesUsingEncoding(NSUTF8StringEncoding)) // 5
- print(strA.characters.count)) // 3
- print(strB.length); // 3
NSString@H_404_3@直接使用 字符串.length@H_404_3@ 就可以获得字符串的长度,但是String敲.length只能敲出 .lengthOfBytesUsingEncoding(NSUTF8StringEncoding)@H_404_3@ 这么算汉字的存储空间就是英文的3倍。 swift真正的类似于.length@H_404_3@的方法就是取出characters@H_404_3@属性(数组)然后.count@H_404_3@
2.5 Swift String比较字符串相等的方式与NSString不同
- let strA: NSString = ""
- let strB: NSString = ""
- let strC: NSString = "dsx"
- let strD: NSString = "dsx"
-
- // NSString 字符串相等
- if(strA.isEqualToString(strB as String)){
- print("yes");
- }
-
- // String的相等
- if (strC == strD){
- print("yes");
- }
NSString@H_404_3@ 有一个方法isEqualToString@H_404_3@ 方法用来判断两个字符串是否完全相等,String没有这个方法,但是因为String@H_404_3@是值类型所以可以直接用 ==@H_404_3@ 判断是否完全相等。
2.6 NSString可以同基本数据类型见转化
- var strA: NSString = "12306"
- var strB: NSString = "0.618"
- var numOfInt = strA.integerValue;
- var numOfDouble = strB.doubleValue;
这个功能Swift没有,所以在json解析或字典转模型时可能会使用NSString比较方便。
Swift String可以通过isEmpty@H_404_3@属性来判断该字符串是否为空
- var emptyStr = ""
- if emptyStr.isEmpty { // NSString没有判断空的方法
- print("It is empty")
- }
这个也是swift String独有的一个属性。一般NSString想判断字符串是否为空都是需要看.length@H_404_3@是否>0。 判断NSString == nil@H_404_3@ 这个方法现在已经不让用了,会报错
Binary operator ‘==’ cannot be applied to operands of type ‘NSString’ and ‘NilLiteralConvertible’
2.7 Swift String独有的字符串插入字符功能
- var strA:String = "My name is dx"
- strA.insert("s",atIndex: strA.characters.indexOf("x")!);
- print(strA) // My name is dsx
这个方法仅仅可以插入单个字符不能插字符串,如果里面写成ss@H_404_3@ 就会报错Cannot convert value of type 'String' to expected argument type 'Character'@H_404_3@
如果你不是在董铂然博客园看到本文,请点击查看原文。
NSString是一个指针不能进行此操作。并且String也拥有NSString的subStringFromIndex 或 ToIndex的功能。
总结:
String的总体功能来看还是比NSString要更加强大,毕竟Swift语法里的正规军。两者有很多的不同,甚至他有你没有的功能说到底都是一个是值类型,一个是引用类型引起的。swift2.0之后扩展了一些属性,这也让String的很多方法的调用方式发生了巨大改变。 还有一些不同正在探索中,希望本文能对读者有所帮助,转载必须注明转载和原文链接。