四、集合类型(字典、合集、数组)

集合类型

数组是有序值的集合。合集是唯一值的无序集合。字典是无序的键值对集合

  • 数组、合集和字典总是明确能储存的值的类型以及它们能储存的键。

  • 不可以插入一个错误类型的值到集合中,可以从集合当中取回确定类型的值

  • 创建一个集合赋值给变量即可变集合,赋值给常量即不可变集合


    集合类型

数组(Array类型桥接到NSArray类)

数组类型写法(完整、简写写法※)
//Array<String> 完整写法
var valueArr :Array<String> = Array<String>()
//[String] 简写写法 *常用
var valueArr1 :[String] = []
数组初始化

数组初始化方法

var someValues :[Int] = []
var someInts = [Int]()
var someItems = Array.init(repeating: 123, count: 3)
var arr2 = [String].init(repeating: "345", count: 5)
var threeItems = Array(repeating: "Garen", count: 3)
var threeNumArrs = Array(repeatElement([123,345], count: 3))
var strArr :[String] = ["Garen","Ashe"]

var mutiArr :[Any] = [123,"234",123.345]//Any类型 可以存放多个类型的值 但不推荐

var addArr = threeItems + strArr //通过+连接符创建

使用数组字面量创建 可省略变量类型
如果已声明变量类型,只能与变量声明类型一致
数组为[Any],可存放多种数据类型
通过+连接符创建 【注意】数据类型兼容才可以相加

访问数组
  1. 数组的count属性
var strArr :[String] = ["Garen","Ashe"]

print("\(strArr.count)")//数组的元素数量

if strArr.isEmpty { //使用Bool类型
    print("strArr is empty")
}
  1. 数组索引、下标
var strArr :[String] = ["Garen","Ashe"]

var firstObject = strArr[1]//通过下标取值
print(strArr[strArr.index(after: strArr.startIndex)])
print(strArr[strArr.index(before: strArr.endIndex)])

print(strArr[strArr.index(strArr.count, offsetBy: -1)])

var index: Int? = strArr.firstIndex(of: "Ashe")//可能没有值 为可选类型
print(strArr[strArr.index(index!, offsetBy: -1)])
  1. 数组元素替换
var strArr :[String] = ["Garen","Ashe"]

var firstObject = strArr[0]//通过下标取值
strArr[0] = "Ionia"//直接改变下标所在值
print(firstObject)//z索引对应的值改变 不改变firstObject的值

strArr[0..<2] = ["Ashe","Catallina","Parker"]//可以替换范围长度不同的值的合集 但是前面的范围不允许越界
  1. 数组元素插入
//数组元素插入

strArr.insert("Nocxus", at: 2)
strArr.insert("Hello", at: strArr.endIndex)
strArr.insert("World", at: strArr.index(after: strArr.startIndex))
strArr.insert(contentsOf: ["Who"], at: strArr.endIndex)

print(strArr)//输出:["Ashe", "World", "Catallina", "Nocxus", "Parker", "Hello", "Who"]

var index1 :Int? = strArr.firstIndex(of: "World")
var index2 :Int? = strArr.index(before: strArr.endIndex)

if let min = index1, let max = index2 {
    let replaceRange = min...max
    strArr.replaceSubrange(replaceRange, with: ["Year","Month","Day"])
    print(strArr)//输出:["Ashe", "Year", "Month", "Day"]
}
  1. 数组元素删除
var strArr :[String] = ["Garen","Ashe","Nocxus","Demacia","Hello","Year"]

let deleteFirstItem = strArr.remove(at: 0)//删除该并返回该元素的值
strArr.removeFirst();//删除首位元素

let deleteLastItem = strArr.removeLast()//删除末尾元素

print(deleteFirstItem,deleteLastItem,strArr)//输出: Garen Year ["Nocxus", "Demacia", "Hello"]

strArr.removeAll()//删除所有元素
  1. 数组元素遍历
//通过for-in遍历数组
for item in strArr {
    print(item)
}

for (index,item) in strArr.enumerated() {
    print(index,item)
}

集合(Set类型桥接到基础类NSSet类)

集合的属性
  • 合集将同一类型且不重复的值无序地储存在一个集合当中。
  • Set类型的哈希值:类型必须提供计算自身哈希值的方法,哈希值是Int值且所有的对比起来相等的对象都相同,比如a==b a.hashValue = b.hashValue
  • Swift的所有基础类型都是可哈希的,并且可以用于集合或者字典的键 没有关联值的枚举成员值,同样默认可哈希
集合类型语法

Set<Element> 没有简写

集合初始化
  1. 使用初始化器语法创建确定类型的空集合
var letters = Set<Character>()
letters.insert("a")
letters = []//基于初始化器的类型,被推断为Set<Character
  1. 使用数组字面量创建集合
var letters = Set<Character>()
letters.insert("a")
letters = []//基于初始化器的类型,被推断为Set<Character

var favoriteHeors :Set<String> = ["Jiawen IV","Paker","Trondel","Trondel"]//String值的集合 重复元素会被删除

//集合类型不能从字面量推断 所以必须显示声明
//但是在使用相同类型的数组字面量不用写集合的包含类型
var demaciaHeros :Set = ["Lax","Silas","Shavans","Gallio"]//根据【类型推断】,集合类型为<String>
集合的访问及修改
  1. 集合count属性 isEmpty属性 contains()函数
if !demaciaHeros.isEmpty {
    print("demaciaHeros have \(demaciaHeros.count) items")//输出:demaciaHeros have 4 items
}

if !demaciaHeros.contains("Vain") {
    print("demaciaHeros haven't Vain")//输出:demaciaHeros haven't Vain
}
  1. 添加元素
demaciaHeros.insert("Vain")//返回插入是否成功Bool 以及插入值
  1. 删除元素
demaciaHeros.removeFirst()//删除首个元素
demaciaHeros.remove("Vain")//删除指定元素
  1. 删除元素
for hero in demaciaHeros {
    print(hero)//输出:Silas Shavans Gallio
}

//以特定的顺序遍历 把合集的元素用sorted()方法作为使用(<)运算符排序的数组返回
for hero in demaciaHeros.sorted(by: <) {
    print(hero)//输出:Gallio Shavans Silas
}
集合相关基本操作
  1. 两集合操作产生New合集
  • 使用 intersection(_:)方法来创建一个只包含两个合集共有值的新合集
  • 使用 symmetricDifference(_:)方法来创建一个只包含两个合集各自有的非共有值的新合集
  • 使用 union(_:)方法来创建一个包含两个合集所有值的新合集
  • 使用 subtracting(_:)方法来创建一个两个合集当中不包含某个合集值的新合集
    阴影部分表示两个集合操作结果
var oneDigist :Set<Int> = [1, 2, 3, 4, 5]
var twoDigist :Set<Int> = [1, 2, 6, 7, 8]

print(oneDigist.union(twoDigist).sorted(by: >))// a U b
print(oneDigist.intersection(twoDigist).sorted(by: >))// a Π b
print(oneDigist.subtracting(twoDigist))
print(oneDigist.symmetricDifference(twoDigist))
  1. 两集合成员关系和相等性
  • 使用“相等”运算符 (==)来判断两个合集是否包含有相同的值;
  • 使用 isSubset(of:)方法来确定一个合集的所有值是被某合集包含;
  • 使用 isSuperset(of:)方法来确定一个合集是否包含某个合集的所有值;
  • 使用 isStrictSubset(of:)或者isStrictSuperset(of:)方法来确定是个合集是否为某一个合集的子集或者超集,但并不相等;
  • 使用 isDisjoint(with:)方法来判断两个合集是否拥有完全不同的值。
    集合成员关系和相等性图解
var oneDigist :Set<Int> = [1, 2, 3, 4, 5]
var twoDigist :Set<Int> = [1, 2, 4, 5, 3]

let threeDigist :Set<Int> = [1, 2, 3]

print(oneDigist == twoDigist)//输出:false
print(threeDigist.isSubset(of: oneDigist))//输出:true
print(oneDigist.isSuperset(of: threeDigist))//输出:true

print(twoDigist.isStrictSubset(of: oneDigist))//输出:false
print(oneDigist.isStrictSuperset(of: twoDigist))//输出:false

print(oneDigist.isDisjoint(with: twoDigist))//输出:false

字典(Dictionary类型桥接到基础类NSDictionary类)

  • 字典储存无序的互相关联的同一类型的键和同一类型的值的集合
字典类型写法

Dictionary<Key,Value> 简写[Key,Value]

字典初始化
var nameDic :Dictionary <String,String> = [:]
var name2Dic = [String:String]()

//用字典字面量创建字典
var numRomanDic :Dictionary<String,String> = ["1":"one","2":"two"]//完整写法
var numRoman2Dic :[String:String] = ["1":"one","2":"two"]//简写方式 *推荐

//根据字面量创建 省略声明类型声明以及键值类型
字典访问及修改
  1. count属性 isEmpty属性
if !numRomanDic.isEmpty {
    print(numRomanDic.count)
}
  1. 添加、更改key关联的值
numRomanDic["4"] = "four"//使用下标h给字典添加元素
numRomanDic["1"] = "five"//更改key关联的值

//通过updateValue(<value:>, forKey:)设置或更改值
numRomanDic.updateValue("six", forKey: "6")//返回nil即为添加
numRomanDic.updateValue("one", forKey: "1")//返回旧值即为修改

与下标不同点在于updateValue(<value:>, forKey:)在执行更新之后返回旧的值,可允许你检查更新是否成功,返回的值是一个字典值类型的可选值 可能为nil(即添加该键值)

返回的值是一个字典值类型的可选值

  1. 通过键取值也是可选类型
//通过可选定绑定类判断
if let num = numRomanDic["1"] {
    print(num)
}
  1. 删除键值对(同理也有直接赋值nil 或通过removeValue(forKey:)方法通过返回的可选值来判断是否成功)
numRomanDic["1"] = nil//使用下标脚本语法删除键值对

if let isDelete = numRomanDic.removeValue(forKey: "2") {
    print(isDelete)
}
  1. 遍历字典
for (key, value) in numRomanDic {
    print(key,value)
}

for key in numRomanDic.keys {
    print(key)
}

for value in numRomanDic.values {
    print(value)
}

let numRomanKeys = [String](numRomanDic.keys)
let numRomanValues = [String](numRomanDic.values)

Swift学习日记4.0

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,635评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,543评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,083评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,640评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,640评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,262评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,833评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,736评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,280评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,369评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,503评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,185评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,870评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,340评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,460评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,909评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,512评论 2 359

推荐阅读更多精彩内容