String和NSString是两个东西,前者是结构体,后者是对象,如果可以尽量使用结构体
创建方式
var str = ""
var str1 = String()
创建方式是上述两种
拼接
str.append("123")
str += "_123"
str = "\(str)_123"
前两个是拼接,第三个是以插值的方式拼接
插入与删除
插入
str.insert("&", at: str.startIndex)
str.insert("&", at: str.endIndex)
str.insert(contentsOf: "8888", at: str.index(str.startIndex, offsetBy: 4))
str.insert(contentsOf: "666", at: str.index(str.endIndex, offsetBy: -4))
插入操作,后面传入String.Index类型,实际按需求来
****小知识点:String.Index或者xxx.xxx类型一般就是内部类型,比如说
struct String {
struct Index{ }
}
上述代码的Index就是String.Index类型
具体怎么生成这个类型,可以查看API
删除
str.remove(at: str.firstIndex(of: "1")!)
let range = str.index(str.endIndex, offsetBy: -4)..<str.endIndex
str.removeSubrange(range)
删除一般是查找删除,或者指定一个range进行删除,具体看上述代码
截取
截取是SubString类型,不是String类型,外加String和SubString都是结构体,所以也不是父子类的关系,不过它们都继承了StringProtocol
截取一般分为前缀,后缀和范围截取
var str = "12345654321"
let preStr = str.prefix(6)
let sufStr = str.suffix(6)
print(preStr) //123456
print(sufStr) //654321
prefix就是前缀从0截到第6位,也就是下标5的位置,suffix则是从后往前
var str = "12345654321"
let range = str.index(str.endIndex, offsetBy: -8)..<str.index(str.endIndex, offsetBy: -4)
print(String(str[range]))
比如这个从倒数第8位截取到倒数第四位,截取之后想转换成字符串加String()即可
SubString和String的区别
截取之后就不是字符串了,而是会变成SubString
借一张图片来说明,Substring在不转为String的情况下还是指向String的内存的,只是地址和大小会发生变化,但是如果重新转换成字符串,则重新申请内存
String和Character
如果单独截取一个字符,会发现不会变成SubString而是直接变成了Character类型
多行字符串
多行字符串由""" """定义,定义是什么格式,打印就是什么格式,需要特殊字符就用\转义
String和NSString
开头就说过了,String和NSString是不同的两个东西
默认情况下生成的就是String,如果使用NSString修饰的话
var str:NSString = "ABC"
如上述代码就是一个NSString了
String和NSString是可以随时转换的,不过NSString是一个对象,内存开销比String会大许多,如果是OC开发完全不习惯String就随意了,从本质而言,两者除了都是针对字符串的处理方式这一点来说,本身几乎没有什么太多共同点,处理方式也不一样
附一张桥接转换表: