swift part 7 数据类型

10 阅读3分钟

一 字符串

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]   // 直接写