一 字符串
1.1 字符串基础
// 1 最常用 字面量
var str = "hello"
let str2: String = "world"
// 2 构造器
var str3 = String("abc")
// 数字转字符串
var str4 = String(123)
// 布尔转字符串
var str5 = String(true)
// 3 空字符串
var empty1 = ""
var empty2: String = String()
// 4 多行字符串
var multi = """
第一行
第二行
"""
// 5 方法
var str = "1_2"
// str.endIndex 是末尾元素后
str.insert("_", at: str.endIndex) // 1_2_
str.remove(at: str.firstIndex(of: "1")!) // _2_
// 拼接字符串
str.append("append") // _2_append
1.2 substring
SubString & String 都是结构体没有继承关系
var str = "1_2_3_4_5"
// 1_2
var substr1 = str.prefix(3)
print("\(substr1)", type(of: substr1),type(of: str)) // 1_2 Substring String
var substr2 = str.suffix(3) // 4_5 subString类型
// substring 指针指向了原String, 引用关系, 并没有发生拷贝
1.3 String 与 Character
var str = "jack"
var c = str[str.startIndex]
print(type(of: c)) // Character
二 数组
2.1 基础
// 空数组
var arr1: [Int] = []
var arr2 = [Int]()
// 直接赋值
var arr3 = [1,2,3,4]
// 显式类型
var arr4: [String] = ["a","b"]
// 泛型写法
var arr4: Array<Int> = [10,20]
// 不可变写法
let array = [1,2,3,4]
// 重复
var arr5 = Array(repeating: 0, count: 5) // 5个0
2.2 map 操作元素 返回新数组
// public func map<T, E>(_ transform: (Element) throws(E) -> T) throws(E) -> [T] where E : Error
// 入参: 闭包 (Element) -> T 传入 数组元素 返回泛型
// 返回数组, 遍历数组, 通过item返回每个元素, 表达式返回每个新元素, 同时生成一个新数组
// 遍历乘机
let array1 = array.map { (item: Int) -> Int in
item * 2 // { $0 * 2 }
}
print(array1) // [2, 4, 6, 8]
// 遍历转字符串
let array11 = array.map { item in
"(item)"
}
print(array11) // ["1", "2", "3", "4"]
2.3 filter 过滤数组
// func filter(_ isIncluded: (Element) throws -> Bool) rethrows -> [Element]
// 入参: 闭包(Element) -> Bool 传入数组元素 返回BOOL
// 返回值: 数组, 通过表达式返回Bool值, 过滤掉返回false的值
let array2 = array.filter { item in
item / 2 == 0 // { $0 / 2 }
}
print(array2) // [1]
2.4 forEach 遍历数组
public func forEach( _ body: (Element) throws -> Void) rethrows
// 入参: (Element) -> Void 传入数组元素 无返回值
// 几乎等于for in
let array = [1, 2, 3, 4, 5]
array.forEach { item in
print(item) // 1,2,3,4,5
}
2.5 array.reduce(0)初始值
// func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, Element) throws -> Result) rethrows -> Result
// 参数: (Result, Element) -> Result
// 返回值: Result
// 0为初始值 partialResult为保存临时保存变量
let array3 = array.reduce(0) { (partialResult, Element) -> Int in
return partialResult + Element // { $0 + $1 }
}
print(array3) // 10
// 累加 0 + 1 + 2 + 3 + 4 = 10
2.6 其他
let arr = ["123", "test", "jack", "-30"]
// 遍历 字符串数组 转Int数组
var arr2 = arr.map { Int($0) }
print(arr2) // [Optional(123), nil, nil, Optional(-30)]
// 缩进数组
var arr3 = arr.compactMap { Int($0) }
print(arr3) // [123, -30]
var arr = [1, 2, 3]
var arr2 = arr.map { Array.init(repeating: $0, count: $0) }
print(arr2) // [[1], [2, 2], [3, 3, 3]]
var arr3 = arr.flatMap { Array.init(repeating: $0, count: $0) }
print(arr3) // [1, 2, 2, 3, 3, 3]
// 数组遵守了equalable协议
let array = [1] + [1,2]
print(array) // [1, 1, 2]
三 字典
基础(最常用)
// 1 简写(最常用)
// 空字典
var dic1: [String: Int] = [:]
var dic2 = [String:Int]()
// 直接赋值
var dic3 = ["name":"小明", "age":18]
// 简写赋值
var dic: [String: Int] = [:]
// 2 完整泛型写法
var dic3: Dictionary<String, Int> = ["a":1, "b":2]
// 3 方法
var arr5 = Array(repeating: 0, count: 5) // 5个0
// 不可变字典
let dic4 = ["x":100]
四 元祖
// 1 匿名元组
var t1 = (10, "张三", true)
print(t1.0, t1.1)
// 2 带标签(推荐,可读性高)
var t2 = (age:20, name:"李四")
print(t2.name)
// 3 显式类型声明
var t3: (Int, String, Bool) = (25, "王五", false)
// 4 不可变元组
let t4 = (1,2)
// 元祖没有泛型写法!!!
五 set 无序集合 都是泛型写法
// 空集合
var s1: Set<Int> = []
// 直接初始化
var s2: Set<String> = ["a","b","c"]
// 不可变
let s3: Set<Int> = [1,2,3]
六 混合类型(Any)
// 数组
var anyArr: [Any] = [1, "hi", true]
// 字典
var anyDic: [String: Any] = [ "name":"小红", "age":22, "isVIP":true ]
七 KeyPath类型
// 官方定义
public class KeyPath<Root, Value> : PartialKeyPath<Root> {
@objc deinit
}
// 使用
let namePath: KeyPath = \Person.name // KeyPath<Person, String>
// 通过键值路径读取, 结构体属性
// 定义一个结构体
struct Person {
var name: String
var age: Int
}
let person = Person(name: "张三", age: 25)
// 创建键路径
let namePath: KeyPath = \Person.name // KeyPath<Person, String>
let agePath = \Person.age // KeyPath<Person, Int>
// 使用键路径取值
let name = person[keyPath: namePath] // "张三"
let age = person[keyPath: agePath] // 25
// 简写方式(Swift 5.2+)
let name2 = person[keyPath: \.name] // 直接写