当你从字符串中获取一个子字符串——例如,使用下标或者prefix(_:)之类的方法——就可以得到一个SubString的实例,而非另外一个String。Swift里的SubString绝大部分函数都跟String一样,意味着你可以使用同样的方式去操作SubString和String。然而,跟String不同的是,你只有在短时间内需要操作字符串时,才会使用SubString。当你需要长时间保存结果时,就把SubString转化为String的实例。
let greeting = "Hello,world!" let index = greeting.firstIndex(of:",")??greeting.endIndex let beginning = greeting[..<index] //beginning的值为“Hello” //把结果转化为String以便长期存储 let newString = String(beginning)
就像String,每一个SubString都会在内存里保存字符集。而String和SubString的区别在于性能优化上,SubString可以重用原String的内存空间,或者另一个SubString的内存空间(String也有同样的优化,但如果两个String共享内存的话,它们就会相等)。这一优化意味着你在修改String和SubString之前都不需要消耗性能去复制内存。就像前面说的那样,SubString不适合长期存储--因为它重用了原String的内存空间,原String的内存空间必须保留直到它的SubString不再被使用为止。
上面的例子,greeting是一个String,意味着它在内存里有一片空间保存字符集。而由于beginning是greeting的SubString,它重用了greeting的内存空间。相反,newString是一个String——它是使用SubString创建的,拥有一片自己的内存空间。
下面的图展示了他们之间的关系:
注:String和SubString都遵循
StringProtocol协议,这意味着操作字符串的函数使用StringProtocol会更加方便。你可以传入String或SubString去调用函数。