又一年过去了,Swift String API又做了一些更改。Swift 4对String带来了一些很需要的改进以及简化。这些是我写的笔记,它记录了我的Swift字符串小抄关于Swift4需要做的改动。
你可以在这里找到原来的和现在更新的指南以及Xcode playground:
字符串是字符串的集合(再次)
这有点令人沮丧。 在Swift2.0中,字符串不再是字符的集合。 现在Swift 4.0它又改回来了。要回顾Swift 2和3,您需要使用集合视图。 所以要使用字符视图来迭代字符:
var sentence = "Never odd or even"
for character in sentence.characters {
print(character)
}
unicodeScalars,utf16和 utf8也存在类似的集合视图。在Swift 4里,这仍然是有效代码,但不再需要这样了,因为String现在是一个集合。直接在String上迭代即可获取字符集:
// Swift 4
let sentence = "Never odd or even"
for character in sentence {
print(character)
}
不需要引用字符集让使用字符串变得更容易。例如,Swift 4的字符串现在直接有一个count属性来获取字符的个数:
// Swift 4
let spain = "España"
spain.count // 6
与Swift 3的方式比较:
// 这种更细的Swift 3的方式仍然有效
spain.characters.count // 6
如果想要得到不同的编码的计数值,仍然可以使用视图:
// 在UTF8编码下的计数
spain.utf8.count // 7
子字符串
Swift 4的另一个重要变化是子字符串。在Swift 4中,分割字符串不会返回String值,而是返回一个Substring的值。Substring具有与String(这符合StringProtocol)大致相同的方法。
Substring和原始字符串共享存储。 因此,应该将其视为临时对象。 根据Swift编程语言(Swift 4):
子字符串不适合长期存储 - 因为它们复用原始字符串的存储,只要使用任何一个子字符串,整个原始字符串必须保存在内存中。
如果想存储它或者传参,把它转换回String。
在Swift 4中,使用下标将字符串分割子字符串。 substring(from :),substring(to :)和substring(with :)都已废弃。
获取从指定索引到末尾子字符串:
let template = "<<<Hello>>>"
let indexStartOfText = template.index(template.startIndex, offsetBy: 3)
let indexEndOfText = template.index(template.endIndex, offsetBy: -3)
// Swift 4
let substring1 = template[indexStartOfText...] // "Hello>>>"
// Swift 3 deprecated
// let substring1 = template.substring(from: indexStartOfText)
获取从开头到指定索引的子字符串:
// Swift 4
let substring2 = template[..<indexEndOfText] // "<<<Hello"
// Swift 3 deprecated
// let substring2 = template.substring(to: indexEndOfText)
获取指定范围额子字符串:
// Swift 4
let substring3 = template[indexStartOfText..<indexEndOfText] // "Hello"
// Swift 3 deprecated
// let substring3 = template.substring(with: indexStartOfText..<indexEndOfText)
Substring转换回String:
let string1 = String(substring1)
使用详细的前缀和后缀方法:
let digits = "0123456789"
let index4 = digits.index(digits.startIndex, offsetBy: 4)
// The first of each of these examples is preferred
digits[...index4] // "01234"
digits.prefix(through: index4)
digits[..<index4] // "0123"
digits.prefix(upTo: index4)
digits[index4...] // "456789"
digits.suffix(from: index4)
多行字符串字面量
Swift现在允许创建一个多行字符串字面量。 用三重双引号(“”“String”“”)将字符串括起来。 在字符串中不需要转义换行符和引号:
let verse = """
To be, or not to be - that is the question;
Whether 'tis nobler in the mind to suffer
The slings and arrows of outrageous fortune,
Or to take arms against a sea of troubles,
"""
您可以使用相对于关闭“”“的文本的缩进来控制前导的空白空间,在上面示例中,字符串没有前导空格,在下面的示例中,我们将文本缩进两个空格:
let indentedText = """
Hello, indent this text with
two spaces.
"""
过长字符串源代码可能难以阅读。 要在源码中分割长行,使用\来转义新行。
let singleLongLine = """
This is a single long line split \
over two lines by escaping the newline.
"""
进一步阅读
Swift Evolution Changes in Swift 4