Swift基础-03(数组和字典)
2017-05-07 本文已影响11人
思考的快与慢
1.Swift中数组基本使用
- 数组的基本使用
func demo() {
let array = ["张三", "李四", "王五"]
print(array) // ["张三", "李四", "王五"]
let array2 = [1,2,4,5]
print(array2) // [1, 2, 4, 5]
let p = CGPoint(x: 10, y: 100)
let array3 = [p]
print(array3) // [(10.0, 100.0)]
// 混合数组 在开发中几乎不用,因为在数组中是靠下表进行索引的
// 如果在数组中的类型不一致,就会自动推到的结果[NSObject]
// 在swift中,还有一种类型[AnyObject] -> 任意对象
// 在swift中,一个类可以没有子类
// let arrar4 = [1, "张三", NSValue(cgPoint: p)]
// print(arrar4)
}
``
- 数组的遍历
func demo2() {
// 按照索引遍历
print("1.按照索引遍历")
let array = ["张三", "李四", "王五"]
for i in 0..<array.count {
print(array[i])
}
// for in 遍历
print("2.for in 遍历")
for s in array {
print(s)
}
// enum + block 遍历,同事遍历下标和内容
// option + click
print("3.enum + block 遍历,同事遍历下标和内容")
for e in array.enumerated() {
print(e)
print("\(e.offset) \(e.element)")
}
print("4.索引下标遍历")
for (n, c) in array.enumerated() {
print("\(n): \(c)")
}
print("5.反序索引遍历,错误的写法")
for (n, s) in array.reversed().enumerated() {
print("\(n) \(s)")
}
print("6.反序索引遍历,正确的写法")
// 需要先遍历在反转
for (n, s) in array.enumerated().reversed() {
print("\(n) \(s)")
}
}
- 数组的增删改
func demo3() {
var array = ["张三", "李四", "王五"]
// 追加
array.append("赵六")
print(array)
// 修改
array[0] = "🌈";
print(array)
// 数组越界
// array[5] = "王八"
array.remove(at: 2)
print(array)
array.removeAll(keepingCapacity: true)
print("\(array) \(array.capacity)") // [] 6
}
- 数组容量,这个在OC中我们经常使用在创建可变数组的时候
var arrar = [Int]() // 定义一个空数组
print("初始容量 \(arrar.capacity)")
for i in 0..<15 {
print("容量 \(arrar.capacity)")
arrar .append(i)
}
print("容量 \(arrar.capacity)")
// 通过打印结果,我们可以看出容量的开辟都是以2的次幂进行开辟的
初始容量 0
容量 0
容量 2
容量 2
容量 4
容量 4
容量 8
容量 8
容量 8
容量 8
容量 16
容量 16
容量 16
容量 16
容量 16
容量 16
- 数组的合并
func demo6() {
let array = ["张三", "李四", "王五"]
let array2 = ["张三", "李四"]
print(array + array2) // ["张三", "李四", "王五", "张三", "李四"]
// let array3 = ["张三", "李四", 18] // 这种定义是错误的
let array4 = ["张三", "李四", 18] as [Any]
// 需要�注意的是讲两个数组合并的时候,要保证这两个数组中元素的类型要一致,所以下面的直接拼接是错误的
// print(array + array4)
}
2.Swift中字典基本使用
- 字典的定义
func demo1() {
let dict: [String:Any] = ["name":"超", "age":18] // 由于字典中的元素是不同的类型,所以需要指定类型
let dict2 = ["name":"超", "age":"18"] // 数组中元素类型一直,可以不用指定,我们在定义字典的时候,最好是指定上,这一点和OC中的指定泛型很像。
let arrar: [[String:Any]] = [
["name":"洋葱", "age":18],
["name":"数学", "height":180]
]
print(dict) // ["name": "超", "age": 18]
print(dict2) // ["name": "超", "age": "18"]
print(arrar) // [["name": "洋葱", "age": 18], ["name": "数学", "age": 180]]
}
定义字典的数组需要注意的地方
A class for converting JSON to Foundation objects and converting Foundation objects to JSON.
一个类从JSON转化为 Foundation 对象或者 Foundation对象转化为JSON
An object that may be converted to JSON must have the following properties:
所有对象能被转化为 JSON(字典或者数组) 必须准守以下规则
- Top level object is an NSArray or NSDictionary
定义节点必须是 NSArray or NSDictionary
- All objects are NSString, NSNumber, NSArray, NSDictionary, or NSNull
所有的对象必须是 NSString, NSNumber or NSNull
- All dictionary keys are NSStrings
所有字典的key必须是字符串
- NSNumbers are not NaN or infinity
NSNumbers 不能为 nil 或者无穷大
- 字典的增删改
func demo2() {
var dict: [String:Any] = ["name":"超", "age":18]
// 新增
dict["title"] = "boss"
print(dict)
// 修改
dict["name"] = "洋葱数学"
print(dict)
// �删除制定的key
dict.removeValue(forKey: "age")
print(dict)
}
- 字典的遍历
func demo3() {
let dict: [String : Any] = ["name": "洋葱数学", "age": 18, "title": "boss"]
for e in dict {
// print(e)
print("\(e.key) \(e.value)")
}
// key value名字可以谁便取
for (key,value) in dict {
print("\(key) \(value)")
}
}
- 字典的合并, 这个和数组有很大的区别,不能直接合并
// 合并
func demo4() {
var dict: [String : Any] = ["name": "洋葱数学", "age": 18, "title": "boss"]
let dict2: [String : Any] = ["name": "洋葱数学", "title": "boss"]
for e in dict2 {
dict[e.key] = dict2[e.key]
}
print(dict) // ["name": "洋葱数学", "age": 18, "title": "boss"]
}