Swift String 合集

基本操作

替换

1
2
let text = "Hello, World!"
print(text.replacingOccurrences(of: "World", with: "Swift")) // "Hello, Swift!"

去首尾空格

1
2
let text = "  Swift  "
print(text.trimmingCharacters(in: .whitespaces)) // "Swift"

分割

1
2
3
4
5
6
7
// 按分隔符拆分字符串
let text = "Swift,UI,Code"
print(text.components(separatedBy: ",")) // ["Swift", "UI", "Code"]

// 按字符拆分字符串
let text = "Swift UI Code"
print(text.split(separator: " ")) // ["Swift", "UI", "Code"]

拼接

1
2
let array = ["Swift", "UI", "Code"]
print(array.joined(separator: " ")) // "Swift UI Code"

大小写转换

1
2
3
let text = "Swift"
print(text.lowercased()) // "swift"
print(text.uppercased()) // "SWIFT"

索引操作

1
2
3
4
5
6
7
8
9
// startIndex 和 endIndex: 获取字符串的起始和结束索引
let text = "Swift"
print(text[text.startIndex]) // "S"
print(text[text.index(before: text.endIndex)]) // "t"

// index(_:offsetBy:): 根据偏移量获取索引
let text = "Swift"
let index = text.index(text.startIndex, offsetBy: 2)
print(text[index]) // "i"

contain

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 精准匹配
let text = "Hello, World!"
print(text.contains("World")) // true


/// 忽略大小写匹配
/// 需要简单的本地化字符串匹配,但不涉及排序规则等复杂逻辑
let text = "Hello, SwiftUI!"
let searchQuery = "swift"

let result = text.localizedCaseInsensitiveContains(searchQuery)
print(result) // true

/// 文本匹配
/// 对大小写不敏感(Hello, SwiftUI! 中的 Swift 与 swift 能匹配)
/// 能正确处理用户语言环境下的特定字符匹配,比localizedCaseInsensitiveContains高级
let text = "Hello, SwiftUI!"
let searchQuery = "swift"

let result = text.localizedStandardContains(searchQuery)
print(result) // true

检查开头或结尾是否为指定字符串

hasPrefix(_:): 检查字符串是否以指定前缀开头

1
2
let text = "Hello, World!"
print(text.hasPrefix("Hello")) // true

hasSuffix(_:): 检查字符串是否以指定后缀结尾

1
2
let text = "Hello, World!"
print(text.hasSuffix("!")) // true

使用 Substring 分割字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
let string = "aaa/bbb/ccc/dddd"
let arraySubstrings: [Substring] = string.split(separator: "/")

var arrayStrings: [String] = []
for item in arraySubstrings {
arrayStrings.append("\(item)")
//arrayStrings.append(String(item))
}

// 或者
let arrayStrings: [String] = arraySubstrings.compactMap { "\($0)" }

// 写法等同于
let arrayStrings: [String] = arraySubstring.compactMap { (item) -> String in
return "\(item)"
}

截取字符串

1
let str = "Hello! World"

这里需要注意的是,以下除非特别说明,不然截取字符串之后获得的都是 Substring。如果需要转变成字符串使用,那么用 String() 扩起来就行了。

单方向截取

这种方式只能从两端中的某一端开始截取,细分的话可以分为从特定下标开始截取从特定字符开始截取
“从特定下标开始截取”适合处理格式固定但内容不固定的字符串,方法如下(注释为输出的结果):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 从字符串开头数6个字符,截取这6个字符——截取前六个字符
str.prefix(6)
// "Hello!"

// 从字符串末尾数5个字符,然后截取这5个字符——截取最后五个字符
str.suffix(5)
// "World"

// 偏移量超过字符串中字符数量,就显示所有的字符
str.suffix(50)
// "Hello! World"

// index表明定位到从开始(startIndex)偏移五个字符(offsetBy: 5)之后的一个字符——这里是感叹号
let index = str.index(str.startIndex, offsetBy: 5)
// 从index定位到的字符开始截取
str.suffix(from: index)
// "! World"

“从特定字符开始截取”适合截取内容有特定字符或格式不固定但是有特定内容的字符串,方法如下:

1
2
3
4
5
6
7
8
9
10
// 从特定字符串开始截取
// 从开始端(左端)的第一个o开始截取
let index = str.firstIndex(of: "o")
str.prefix(through: index!)
// "Hello"

// 从末端(右端)的第一个o开始截取
let index = str.lastIndex(of: "o")
str.suffix(from: index!)
// "orld"

这段代码还可以这么写:

1
2
3
4
5
6
7
8
9
10
11
12
// 还可以这样写
// 从开始端(左端)的第一个o开始截取
if let index = str.firstIndex(of: "o") {
str.prefix(through: index)
}
// "Hello"

// 从末端(右端)的第一个o开始截取
if let index = str.lastIndex(of: "o") {
str.suffix(from: index)
}
// "orld"

截取中间一段

这种方式会截取字符串中间的一段,同样有两种使用下标截取中间一段字符特定字符截取两种办法。
使用下标截取中间一段字符的方法如下:

1
2
3
4
5
6
7
// 截取第二个到第九个字符之间的字符
str.dropFirst(3).prefix(9) as Substring
// "lo! Worl"

// 截取第二个到倒数第二个字符之间的字符
str.dropFirst(3).dropLast(3) as Substring
// "lo! Wo"

这里注意需要加上最后的

截取两个特定字符中间的一段字符串并没有这么简单的办法,实现方法会有些复杂。这里慢慢说。
例如我们需要截取两个“o”之间(含两端的“o”)的字符串:

1
2
3
4
let index1 = str.firstIndex(of: "o")
let str2: String = String(str.suffix(from: index1!)) //"o! World"
let index2 = str2.lastIndex(of: "o")
let str3 = str2.prefix(through: index2!) //"o! Wo"

这里首先是使用单向(从右端)截取了一段,然后将这段使用 String 转变成字符串格式并且定义为一个新的字符串,然后对其实行反向(从坐左端)截取了一段。这样是包含两端的“o”的。
那么如果我们不想要右端的“o”呢?使用以下方法:

1
2
3
4
let index1 = str.firstIndex(of: "o")
let str2: String = String(str.suffix(from: index1!)) //"o! World"
let index2 = str2.lastIndex(of: "o")
let str3 = str2.prefix(upTo: index2!) //"o! W"

只用将最后一行代码的 through 变成 upTo 就可以了。
那么如果我们两端都需要去掉“o”呢?使用以下方法:

1
2
3
4
let index = str.lastIndex(of: "o")
let str2 = String(str.prefix(through: str.index(before: index!))) //"Hello! W"
let index2 = str2.lastIndex(of: "o")
str2.suffix(from: str2.index(after: index2!)) //"! W"

format 使用

最简单的方法

字符串中包裹着 \()

1
2
3
4
5
6
7
8
let age = 10
let name = "xxx"

let string = String(format: "%@ Age Is %d", name, age)

Text("\(name) Age Is \(age)")
Text(name + "Age Is" + String(age))
Text(string)

整数与小数

整数

1
2
3
4
let string = String(format: "%d", 123892674027)
Text(string)
// 结果却是:"-661377557"
let string = String(format: "%ld", 123892674027)

如果数据大,可能大于 2147483647(10 位),使用 "%ld",否则使用 "%d" 即可。

长度修饰符

  • h,代表 shor t或者 unsigned short
  • l,代表 long 或者 unsiged long (ll 表示 long long 或者 unsigned long long) Int
  • L,代表 Long double

小数

1
2
3
let i = 1.1111
let string = String(format: "%f", i) // 1.1111,默认保留 6 位小数
let string = String(format: "%.2f", i) // 1.11,输入几保留几位小数

占位符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
let minutes: Int = 8
let seconds: Int = 9
String(format: "%02d:%02d", minutes, seconds) //08:09


let i: Int = 36
let i2: Int = 350087
// 固定四位显示
String(format: "%4d", i) // " 36" (注意有两个空格)
String(format: "%4d", i2) // "350087" (位数大于,则全部显示)

// 固定四位显示,不足补0
String(format: "%04d", i) // "0036"
String(format: "%04d", i2) // "350087" (位数大于,则全部显示)

参考

  1. Swift 数字字符串格式化
  2. 透過 String 讓數值格式化呈現(整數補零、小數四捨五入至第幾位數)

Swift String 合集
https://wonderhoi.com/2024/01/19/Swift-String-合集/
作者
wonderhoi
发布于
2024年1月19日
许可协议