Swift集合类型(4)
2020-07-07 本文已影响0人
_菩提本无树_
教程目录
与OC一样的内容不重复介绍
集合类型
Swift中的这些集合和OC中的不一样,具体不一样是多了泛型的概念.像Java靠拢了,跟Java的泛型基本一致.
2020.07.07(第一更)
一.数组(Arrays)
简介:可以存储重复数据,只能存储一种类型的,不能混合存储,除非是Any类型,下面有讲.
2020.07.08(第二更)
数组的初始化
/// 数组初始化
func arrayInit() {
//下面是存储的Int类型的数组,其他的类型不能放进去
var arr = [Int]();
//之前已经确认了arr存储的数据类型,所以可以像下面这种创建一个空数组,将arr清空
arr = [];
//不确定存储类型时使用any,这个时候可以添加任意类型的内容
var arr1 = [Any]();
//直接声明数组
let arr2 = [1,3,5];
//只能存储字符串
let arr3:[String] = [];
//初始化时赋值
let arr4:[String] = ["2"];
//初始化带有默认值的数组,arr5中有20个元素都为0
let arr5 = Array(repeating: 0, count: 20);
//通过其他的数组初始化,将arr4的内容添加到arr6中,修改arr6不影响arr4
var arr6 = Array(arr4);
arr6.append("32");
}
数组的增删改查
/// array的增删改查
func arrFunc() {
let arrStrTemp: [String] = ["10","12","13","14","15","16","17","18","19","20","21","22","23","24"]
var arrStr: [String] = ["1"];
//像尾部添加单个元素
arrStr.append("2");
//将整个数组拼接到后面
arrStr.append(contentsOf: arrStrTemp);
//插入单个元素指定位置
arrStr.insert("3", at: 2);
//将数组插入数组
arrStr.insert(contentsOf: arrStrTemp, at: 4);
//还有一种步进增加,目前只试了字符串不行,数值可以
//从30开始步进为5,到60停止
var arrInt: [Int] = [1];
arrInt.append(contentsOf: stride(from: 30, to: 60, by: 5));
//删除指定坐标的元素,并会返回删除的这个元素
var removeStr = arrStr.remove(at: 0);
//删除最后的元素,并会返回删除的这个元素
var removeStrLast = arrStr.removeLast();
//删除第一个元素,并会返回删除的这个元素
var removeStrFirst = arrStr.removeFirst();
//删除从开始数前三个元素
arrStr.removeFirst(3);
//删除从末尾开始数倒数两个元素
arrStr.removeLast(2);
//删除指定范围的元素
arrStr.removeSubrange(0...2);
let range = Range.init(0...3);//0..<4
let range1 = Range.init(NSMakeRange(0, 3));//0..<3
arrStr.removeSubrange(range);
if let r = range1 {
arrStr.removeSubrange(r);
}
//清空数组
arrStr.removeAll();
//清空数组,但是保留数组现有的容量,默认为false
arrStr.removeAll(keepingCapacity: true)
//前面删光了,得添加一点
arrStr.append(contentsOf: arrStrTemp);
//改元素,最直接的
arrStr[1] = "00";
//范围替换,替换的数量可以更多,相当于变相的增加
arrStr.replaceSubrange(0..<3, with: ["22","33","44","99"]);
//查询某个坐标下的元素,
let strTwo = arrStr[2];
//查询0-3之间的元素,返回一个数组
let strT = arrStr[0...3];
//查询arrStr前三位之后的元素
let strArr1 = arrStr.suffix(from: 3);
//查询arrStr前面三个元素
let strArr2 = arrStr.prefix(upTo: 3);
}
数组的其他用法
/// 数组的其他用法
func arrOtherFunc() {
var arrOne: [String] = ["1","2","3","4","5","6","7"];
var arrTwo: [String] = ["11","22","33","44","55","66","77"];
//两个数组生成一个数组,真简单
var arrAll = arrOne+arrTwo;
//获取数组数量
var count = arrAll.count;
//还有一个属性capacity容量,这个属性和count不一样
//count指的是数组中具体包含的元素个数,capacity指的是数组可以容纳的元素个数,一般是capacity>=count
var capacity = arrAll.capacity;
//判断数组是否空
if arrAll.isEmpty {
}
//数组遍历,顺序遍历
for item in arrAll {
print(item);
}
//枚举器遍历,也是顺序遍历,可以获取下标
for (index,value) in arrAll.enumerated() {
print(String(index) + ":" + value);
}
//数组添加进集合,没发现好的方法,目前只能遍历添加,有好的方法请告知谢谢
var setStr: Set<String> = [];
for item in arrAll {
setStr.insert(item);
}
//数组转字符串
let str = arrAll.joined();
//通过-将元素链接
let str1 = arrAll.joined(separator: "-");
//字符串转数组
let newArr = str1.components(separatedBy: "-");
}
上面总结的只是常用的,很多swift新增的比较偏门的方法没有列出,如果需要还是自己查文档吧.
二.集合(Set)
集合用来存储相同类型并且没有确定顺序的值。当集合元素顺序不重要时或者希望确保每个元素只出现一次时可以使用集合而不是数组。
集合中的元素必须是可以可哈希化的,该类型必须提供一个方法来计算它的哈希值。一个哈希值是 Int 类型的.
集合初始化
/// 初始化Set
func setInit() {
//创建存储字符的集合
let charSet = Set<Character>();
//创建存储字符串的集合
let strSet = Set<String>();
//创建存储Int类型的集合
let intSet = Set<Int>();
//使用数组的方式创建集合
let arrSet: Set = ["1","2"];
//只是定义了没有初始化,不能使用
let arrSet1: Set<String>;
//初始化
arrSet1 = [];
//基本上跟java十分类似了
}
集合的增删
/// 集合的增删
func setFunc() {
var strSet: Set<String> = [];
let strSetTemp: Set = ["1","2","3","4"];
//集合增加元素,因为集合没有顺序,也就没有下标的概念,所以下面的所有操作没有index的概念
strSet.insert("5");
strSet.insert("1");
//strSet删除元素,返回删除的元素,如果没有会返回nil
var removeStr = strSet.remove("1");
//删除第一个
strSet.removeFirst();
//删除全部
strSet.removeAll();
//查找集合中是否有某个元素
let contain: Bool = strSet.contains("1");
}
集合其他相关操作
/// 集合其他相关操作
func setOtherFunc() {
var setStr: Set<String> = ["1","2","3","4","5","6","7","8","11","55"];
var setStrTemp: Set<String> = ["11","22","33","44","55","66","3","4"];
//判断集合中是否有"1",有的话返回,没有的话添加进去.
let s = setStr.update(with: "1");
//遍历集合,无序
for item in setStr {
print(item);
}
//遍历集合通过sorted函数进行排序遍历
for item in setStr.sorted() {
print(item);
}
//求集合交集
let intersectionSet = setStr.intersection(setStrTemp);
//去除两者都包含的内容,返回新的集合
let symmetricDifferenceSet = setStr.symmetricDifference(setStrTemp);
//求合集
let unionSet = setStr.union(setStrTemp);
//删除调用的集合中两者共有的元素生成新的集合
let subtractingSet = setStr.subtracting(setStrTemp);
//以上的几个方法都生成新的集合
//排序后转数组
let arr: [String] = subtractingSet.sorted();
print(arr);
//还有是否属于子集合,父集合什么的不写了,很简单
}
三.字典
字典与OC类型还是一样的.内容较少不分块了
/// 字典使用
func dictionaryUse() {
//注意⚠️字典是无序的
//初始化字典,下面这几个没有用到所以直接用_代替名字了,不然报黄太恶心了
let _ = [Int:String]();
let _:[Int:String];
let _:[Int:String] = [:];
let _:Dictionary<Int,String> = [:];
let _ = ["1":"1"];
//基本也就是上面的这几种形式了,会一种就够了
//实操
let dicTemp:Dictionary<String,String> = ["1":"赵","2":"钱","3":"孙","4":"李","5":"周"];
var dic:[String:String];
//给字典赋值
dic = dicTemp;
//获取所有的key
let keys = dic.keys;
//获取所有的value
let values = dic.values;
//注意⚠️⚠️⚠️⚠️⚠️⚠️字典是无序的,所以下面所有使用下标法的直接注释了
//设置值,使用的是下标法,也就是根据key
// dic[keys.first ?? "1"] = "王";
// dic[keys[keys.index(keys.startIndex, offsetBy: 2)]] = "吴";
dic["3"] = "任";
//没有key就会添加新的键值对
dic.updateValue("张", forKey: "11");
dic["6"] = "轩";
//注意⚠️字典是无序的
//根据key获取值
// let first = dic[keys.first ?? "1"];
// let second = dic[keys[keys.index(after: keys.startIndex)]];
// let last = dic[keys[keys.index(keys.endIndex, offsetBy: -1)]];
let other = dic["4"];
//删除两种方式,第一种直接赋值nil,第二种remove,个人更倾向于remove
//下面的几种删除都有返回值,删除成功会返回对应的内容,否则返回nil
//根据下标
// dic.remove(at: dic.index(after: dic.startIndex));
//根据key
dic.removeValue(forKey: "5");
//设置nil
dic["3"] = nil;
//遍历
for item in dic {
print("\(item.key):\(item.value)");
}
for (key,value) in dic {
print(key+":"+value);
}
//删除所有
dic.removeAll();
//删除所有但保留dic的容量
dic.removeAll(keepingCapacity: true);
}