1. Swift 基础数据类型的拓展.png

字符串

字符串的插入和删除

  1. var string = "huangjian"
  2. string.insert(".", at: string.startIndex)
  3. print(string) // ".huangjian"
  4. string.insert(contentsOf: "Mr", at: string.startIndex)
  5. print(string) // "Mr.huangjian"
  6. string.insert(contentsOf: "(", at: string.index(after: string.startIndex))
  7. print(string) // "M(r.huangjian"
  8. string.insert(contentsOf: ")", at: string.index(before: string.endIndex))
  9. print(string) // "M(r.huangjia)n"
  10. string.insert(contentsOf: "Hello! ", at: string.index(string.startIndex, offsetBy: 0))
  11. print(string) // "Hello! M(r.huangjia)n"
  12. string.remove(at: string.firstIndex(of: "!")!)
  13. print(string) // "Hello M(r.huangjia)n"
  14. string.removeAll(where: { $0 == "l"})
  15. print(string) // "Heo M(r.huangjia)n"
  16. var range = string.index(string.startIndex, offsetBy: 0)..<string.index(string.startIndex, offsetBy: 4)
  17. string.removeSubrange(range)
  18. print(string) // "M(r.huangjia)n"

字符串截取

将 String 类型的字符串截取后,子字符串的类型是 SubString。

  1. import Foundation
  2. var string = "mr.huangjian"
  3. var subString = string.prefix(2) // 从最左边往右截取的最大长度,若越界返回完整的字符串
  4. print(subString) // "mr"
  5. subString = string.suffix(4) // 从最右边往左截取的最大长度,若越界返回完整的字符串
  6. print(subString) // "jian"
  7. var range = string.startIndex..<string.index(string.startIndex, offsetBy: 3)
  8. subString = string[range]
  9. print(subString) // "mr."
  10. // 将 Substring 转换成 String
  11. var str = String(subString)
  12. print(str, type(of: str)) // "mr." String
  13. // 转换成 NSString,使用其 API
  14. var firstName = (string as NSString).substring(with: NSRange(location: 3, length: 5))
  15. print(firstName) // "huang"

字符串格式化

总共 5 种情况:

  1. let name = "mr.huangjian"

用双引号 “ “ 包裹的单行字符串

  • 若字符串原始内容包含 \ “ 等特殊字符,需要转义
  • 若需要引用变量,使用 (Value) 包裹即可
  1. let eg1 = "Example1: \"Are you \(name) ? \""
  2. print(eg1) // Example1: "Are you huangjian ? "

用三对引号 “”” “”” 包裹的多行字符串

  • 若字符串原始内容包含 \ “ 等特殊字符,需要转义
  • 若需要引用变量,使用 (Value) 包裹即可
  • 注意最后的 “”” 不一定要放在该行的最左边
  1. let eg2 = """
  2. Example2:
  3. Are you \(name) ?
  4. """
  5. print(eg2)
  6. /*
  7. Example2:
  8. Are you mr.huangjian ?
  9. */

用双井号和双引号 #” “# 包裹的单行字符串

  • 若字符串原始内容包含 \ “ 等特殊字符,无需转义也无法转义
  • 若需要引用变量,使用 #(Value) 包裹即可
  1. let eg3 = #"Example3: "Are you \#(name) ? ""#
  2. print(eg3) // Example3: "Are you huangjian ? "

用双井号和三对引号 #””” “””# 包裹的多行字符串

  • 若字符串原始内容包含 \ “ 等特殊字符,无需转义也无法转义
  • 若需要引用变量,使用 #(Value) 包裹即可
  1. let eg4 = #"""
  2. Example4:
  3. Are you \#(name) ?
  4. """#
  5. print(eg4)
  6. /*
  7. Example4:
  8. Are you mr.huangjian ?
  9. */

使用 # 包裹字符串, 默认会以 # 为字符串的结束符号, # 后面的文字将不再处理。
在这种情况下,即字符串内容也包含 “# 的情况,我们使用 ## 处理。

  1. let eg5 = ##"I live in "#512"."##
  2. print(eg5) // I live in "#512".

String 与 Data 互转

  1. let name = "huangjian"
  2. let data = name.data(using: .utf8)
  3. let string = String(data: data, encoding: .utf8)

判断是否为空字符串或 nil

  1. extension String {
  2. var isBlank: Bool {
  3. return allSatisfy({$0.isWhitespace})
  4. // return self.trimmingCharacters(in: CharacterSet.whitespaces).count == 0
  5. }
  6. }
  7. extension Optional where Wrapped == String {
  8. var isBlank: Bool {
  9. return self?.isBlank ?? true
  10. }
  11. }

整型

SE-0225 为整数类型添加了一个方法 isMultiple,该方法可以检查一个整数是否为另一个整数的倍数

  1. for v in 0...10 {
  2. if v % 2 != 0 {
  3. print("Odd: \(v)") // 偶数 Even,奇数 Odd
  4. }
  5. }
  1. for v in 0...10 {
  2. if v.isMultiple(of: 2) {
  3. print("Even: \(v)") // 偶数 Even,奇数 Odd
  4. }
  5. }

字典

SE-0218 为字典新增了一个方法 compactMapValues

  1. let dict = [
  2. "1st": 10,
  3. "2nd": 20,
  4. "3rd": 18,
  5. "4th": 28,
  6. ]
  7. let v1 = dict.compactMap({ $0.value >= 20 })
  8. print(v1) // [false, true, true, false] 返回的结果是无序的
  9. let v2 = dict.mapValues({ $0 + 1 })
  10. print(v2) // ["2nd": 21, "3rd": 19, "1st": 11, "4th": 29]
  1. /**
  2. compactMapValues 除了包含 compactMap 和 mapValues 的功能,还会自动过滤不符合条件的键值对
  3. */
  4. let man = [
  5. "name": "huangjian",
  6. "age": "18",
  7. ]
  8. let v3 = man.compactMapValues({ Int($0) })
  9. print(v3) // ["age": 18]