字符串
字符串的插入和删除
var string = "huangjian"
string.insert(".", at: string.startIndex)
print(string) // ".huangjian"
string.insert(contentsOf: "Mr", at: string.startIndex)
print(string) // "Mr.huangjian"
string.insert(contentsOf: "(", at: string.index(after: string.startIndex))
print(string) // "M(r.huangjian"
string.insert(contentsOf: ")", at: string.index(before: string.endIndex))
print(string) // "M(r.huangjia)n"
string.insert(contentsOf: "Hello! ", at: string.index(string.startIndex, offsetBy: 0))
print(string) // "Hello! M(r.huangjia)n"
string.remove(at: string.firstIndex(of: "!")!)
print(string) // "Hello M(r.huangjia)n"
string.removeAll(where: { $0 == "l"})
print(string) // "Heo M(r.huangjia)n"
var range = string.index(string.startIndex, offsetBy: 0)..<string.index(string.startIndex, offsetBy: 4)
string.removeSubrange(range)
print(string) // "M(r.huangjia)n"
字符串截取
将 String 类型的字符串截取后,子字符串的类型是 SubString。
import Foundation
var string = "mr.huangjian"
var subString = string.prefix(2) // 从最左边往右截取的最大长度,若越界返回完整的字符串
print(subString) // "mr"
subString = string.suffix(4) // 从最右边往左截取的最大长度,若越界返回完整的字符串
print(subString) // "jian"
var range = string.startIndex..<string.index(string.startIndex, offsetBy: 3)
subString = string[range]
print(subString) // "mr."
// 将 Substring 转换成 String
var str = String(subString)
print(str, type(of: str)) // "mr." String
// 转换成 NSString,使用其 API
var firstName = (string as NSString).substring(with: NSRange(location: 3, length: 5))
print(firstName) // "huang"
字符串格式化
总共 5 种情况:
let name = "mr.huangjian"
用双引号 “ “ 包裹的单行字符串
- 若字符串原始内容包含 \ “ 等特殊字符,需要转义
- 若需要引用变量,使用 (Value) 包裹即可
let eg1 = "Example1: \"Are you \(name) ? \""
print(eg1) // Example1: "Are you huangjian ? "
用三对引号 “”” “”” 包裹的多行字符串
- 若字符串原始内容包含 \ “ 等特殊字符,需要转义
- 若需要引用变量,使用 (Value) 包裹即可
- 注意最后的 “”” 不一定要放在该行的最左边
let eg2 = """
Example2:
Are you \(name) ?
"""
print(eg2)
/*
Example2:
Are you mr.huangjian ?
*/
用双井号和双引号 #” “# 包裹的单行字符串
- 若字符串原始内容包含 \ “ 等特殊字符,无需转义也无法转义
- 若需要引用变量,使用 #(Value) 包裹即可
let eg3 = #"Example3: "Are you \#(name) ? ""#
print(eg3) // Example3: "Are you huangjian ? "
用双井号和三对引号 #””” “””# 包裹的多行字符串
- 若字符串原始内容包含 \ “ 等特殊字符,无需转义也无法转义
- 若需要引用变量,使用 #(Value) 包裹即可
let eg4 = #"""
Example4:
Are you \#(name) ?
"""#
print(eg4)
/*
Example4:
Are you mr.huangjian ?
*/
使用 # 包裹字符串, 默认会以 # 为字符串的结束符号, # 后面的文字将不再处理。
在这种情况下,即字符串内容也包含 “# 的情况,我们使用 ## 处理。
let eg5 = ##"I live in "#512"."##
print(eg5) // I live in "#512".
String 与 Data 互转
let name = "huangjian"
let data = name.data(using: .utf8)
let string = String(data: data, encoding: .utf8)
判断是否为空字符串或 nil
extension String {
var isBlank: Bool {
return allSatisfy({$0.isWhitespace})
// return self.trimmingCharacters(in: CharacterSet.whitespaces).count == 0
}
}
extension Optional where Wrapped == String {
var isBlank: Bool {
return self?.isBlank ?? true
}
}
整型
SE-0225 为整数类型添加了一个方法 isMultiple,该方法可以检查一个整数是否为另一个整数的倍数
for v in 0...10 {
if v % 2 != 0 {
print("Odd: \(v)") // 偶数 Even,奇数 Odd
}
}
for v in 0...10 {
if v.isMultiple(of: 2) {
print("Even: \(v)") // 偶数 Even,奇数 Odd
}
}
字典
SE-0218 为字典新增了一个方法 compactMapValues
let dict = [
"1st": 10,
"2nd": 20,
"3rd": 18,
"4th": 28,
]
let v1 = dict.compactMap({ $0.value >= 20 })
print(v1) // [false, true, true, false] 返回的结果是无序的
let v2 = dict.mapValues({ $0 + 1 })
print(v2) // ["2nd": 21, "3rd": 19, "1st": 11, "4th": 29]
/**
compactMapValues 除了包含 compactMap 和 mapValues 的功能,还会自动过滤不符合条件的键值对
*/
let man = [
"name": "huangjian",
"age": "18",
]
let v3 = man.compactMapValues({ Int($0) })
print(v3) // ["age": 18]