作为 iOS 开发人员在 Swift 中认识字符串

swift 中的字符串是 iOS 开发人员非常常用的。我们用字符串的力量解决了我们开发中的各种问题。但是我们通常会忽略字符串中的一些重要功能。在本文中,我尝试收集此类功能并可能添加一些扩展。

从字符串中分离子字符串

在开发中,我们遇到了读取 csv 文件和分隔用户输入的标签。在这些场景中,我们需要从由某个分隔符分隔的字符串创建一个字符串数组。在这里可以使用 swift 中的“组件”功能。

let res = str.components(separatedBy: ",")

输出是原始字符串中由“,”分隔的字符串数组。

基于索引的用例

字符串中的字符可以通过字符串的索引访问。与其他编程语言不同,我们不会在 swift 中使用基于整数的访问。
一个突出的原因是 swift 中字符的长度不统一。 组成字符的 unicode 点组合各不相同。所以索引每次都是针对字符串计算的。

索引……之后

有时我们需要在字符串的某些部分/索引之后获取字符的索引,即从第二个字符(’lephant’)开始的’elephant’中’e’的索引。以下是可以帮助您的扩展程序。

extension Array where Element == Character {
  func index(of character: Character, after index: Int) -> Int? {
    for i in index..<self.count where self[i] == character {
       return i
    }
    return nil
  }
}

部分更换

考虑您正在制作一个 IDE 或某个编辑器,其中提供用户将字符串的一部分替换为另一个。我们可以使用以下方法来做到这一点。

str.replacingOccurrences(of: "xcode", with: "Xcode")

另外,如果我们想替换两个给定字符或子字符串之间的字符串,我们可以使用以下方法。


guard let startIndex = str.firstIndex(of: "a") else { return false} 
guard let endIndex = str.firstIndex(of: "o") else { return false}
str.replaceSubrange(startIndex...endIndex, with: "oil")

边界测试

测试子字符串是否从开头或结尾出现在字符串中。

从开始

str.hasPrefix("i")
// 测试一个字符串在字典序上是否大于其他字符串
str.lexicographicallyPrecedes("zzz")

从结局

str.hasSuffix("i")

两个字符串的区别

作为开发人员,我们可能会遇到一个问题,需要对 str1 进行多少更改(插入和删除)才能成为 str2。

str = "oil"
let dif = str.difference(from: "oii")
print(dif) 
/* CollectionDifference<Character>(insertions: [Swift.CollectionDifference<Swift.Character>.Change.insert(offset: 2, element: "l", associatedWith: nil)], removals: [Swift.CollectionDifference<Swift.Character>.Change.remove(offset: 2, element: "i", associatedWith: nil)]) */
print(dif.insertions.count+dif.removals.count) // 2

最大值

在字符串中找到最高字符并不复杂。但是字符串中的 max() 存在一些歧义。以下有助于澄清

str = "aAB"
str.max() // a

请注意,小写字母被认为是最大的。

小数位数/小写字母/大写字母/….(CharacterSet)

正如标题所说,从字母数字字符串中只计算字母或小数或小写甚至更多可能会有所帮助。下面是这样做的小扩展。

extension String {
  func count(of characterSet: CharacterSet) -> Int {
    var count = 0
    var range = self.rangeOfCharacter(from: characterSet)
    while range != nil {
      count = count + 1
      guard let ub = range?.upperBound else {
         break
      }
      range = self[ub...].rangeOfCharacter(from: characterSet)
    }
    return count 
  }
} 

精品教程推荐


加入我们一起学习SwiftUI

QQ:3365059189
SwiftUI技术交流QQ群:518696470
教程网站:www.openswiftui.com

发表回复