
字符串
字符串的插入和删除
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 Foundationvar 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 转换成 Stringvar str = String(subString)print(str, type(of: str)) // "mr." String// 转换成 NSString,使用其 APIvar 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]
