发布于 2年前

Swift 4字符串的更新

又一年过去了,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.
    """
©2020 edoou.com   京ICP备16001874号-3