Swift String 合集

基本操作

1
2
3
4
5
6
7
8
9
10
11
12
let s = " / 2 3 4 ? / "
// 替换
print("空格替换成-:", s.replacingOccurrences(of: " ", with: "-"))
// 过滤
print("空格过滤掉:", s.replacingOccurrences(of: " ", with: ""))
// 去首尾空格
print("去掉空格:", s.trimmingCharacters(in: .whitespaces))
// 分割
print("分割:", s.components(separatedBy: "/"))
// 拼接
let a = ["1", "2", "3"]
print("拼接:", a.joined(separator: "-"))

使用 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日
许可协议