Swift集合类型

Swift有三种集合类型,包括

  • Array,有序可重复
  • Set,无序不可重复
  • Dictionary,无序不可重复(key)的键值对

集合中数据类型必须相同,集合支持泛型

集合的可变性

varlet决定。使用let,编译器会进行优化

数组(Arrays)

数组的数据结构为有序列表

数组的简单语法

创建数组的几种形式

let array1 = Array<Int>()
let array2 = [Int]()
let array3 = [Int](arrayLiteral: 1,2,3)
let array4 = [1,2,3]

在数组的类型被确定后,再次使用赋值语句时,swift可以自动推断类型

let array1 = []//一个类型为[Int]的空数组
带默认值的数组
let array1 = Array<Int>(repeating: 0, count: 3)
let array2 = [Int](repeating: 0, count: 3)
let array3 = Array(repeating: 0, count: 3)

等价于

[0,0,0]
通过两个数组相加创建一个数组

使用+来组合两种类型相同的数组。新数组类型自动推断

let array1 = [Int](arrayLiteral: 1,2,3)
let array2 = [1,2,3]
let array3 = array1 + array2
print(array3)
访问和修改数组

使用方法,属性和下标对数组进操作
属性:countisEmpty
方法:append(_:)insert(_:at:)remove(at:)
下标:

var array = [1,2,3]
array[0] = 10

切片替换:

var array = [1,2,3,4,5,6,7,8]
array[1...3] = [10,10,10,10,10,10,10]
print(array)//[1, 10, 10, 10, 10, 10, 10, 10, 5, 6, 7, 8]

切片和新值的个数不必一致
remove(at:)下标语法的返回值不是可选类型,这就是说,在越界或者空数组时,会发生运行时错误

数组遍历

使用for-in

var array = [1,2,3,4,5,6,7,8]
for value in array{
    print(value)
}

for value in array.enumerated(){
    print(value)//元组
}

集合

集合内数据类型相同,没有顺序,值唯一,集合中的值都是可哈希的

哈希值

对象相同,哈希值一定相同,哈希值是Int类型的。Swift的所有基本类型(StringIntDoubleBool)都是可哈希的,没有关联值的枚举成员值默认也是可哈希的。
自定义的类型如果想要作为键值或者集合中的值,必须实现Hashable

集合的语法
var set = Set<Int>()

set的类型由于构造器语法Set<Int>被推断为Set<Int>
类型确定后,以后的赋值就不需要指明类型了

var set = Set<Int>()
set.insert(1)
print(set)
set = []//不需要指明类型
用数组字面量创建集合

数组字面量会被推断为数组,所以我们需要显式指明类型

var set:Set<Int> = [1,2,3,4,]//最后可以多一个`,`

Int类型可以被推断
简写为

var set:Set = [1,2,3,4,]
访问修改集合

属性:countisEmpty
方法:insert(_:)remove(_:)
remove(_:)的返回值是可选类型,因为要删除的值在集合中找不到,这点和数组不同,如果硬要说是为了安全性,为什么数组会发生运行时错误呢🙃?

集合遍历
var set:Set = [4,2,1,7,10]
for value in set{
    print(value)
}
for value in set.sorted(){
    print(value)
}

集合是无序的,我们可以使用sorted()函数排序

既然是集合,肯定有并集交集子集真子集等概念

集合基本操作

交集intersection()
并集union()
sysmmetricDifference():并集减交集
subtracting():并集减参数中的那个集合
不举例了

集合之间的关系
  • 相等(==),比较两个集合中的元素是否全部相同
  • isSubset(of:),是否子集
  • isSuperset(of:),是否超集
  • isStrictSubset(of:),是否真子集
  • isStrictSuperset(of:),是否真超集
  • isDisjoint(with:),是否不相交

不举例了

字典

键值对组成,键可哈希,不可重复

创建语法
var dict1 = Dictionary<Int,String>()
var dict2:Dictionary<Int,String> = [:]
var dict3 = [1:"1"]//字面量
var dict4 = [Int:String]()
访问和修改

属性:countisEmpty
方法:updateValue(value,key)下标赋值下标取值removeValue(key)下标删除
下标赋值updateValue(value,key)都是存在时,更新值,不存在时,插入值。需要特别注意的是,updateValue会返回一个可选类型的值,表示,值存在时返回旧值,值不存在时返回nil
下标取值返回可选类型表达值缺失,同样是下标取值,数组可没这待遇,😄
removeValue(key)下标删除都可以删除元素,removeValue(key)会把删除的元素返回,类型为可选,表达值缺失,下标删除为dict[1]=nil的形式

字典遍历
var dict = [1:"1",2:"2",3:"3",4:"4",5:"5"]

for value in dict{
    print(value)//一个个元组
}

for (a,b) in dict{
    print("\(a) \(b)")//起个名字
}

for key in dict.keys{
    print(key)//只遍历键
}

for value in dict.values{
    print(value)//只遍历值
}

for key in dict.keys.sorted(){
    print(key)//给键排序
}
使用键名或值构建数组
var array1 = [Int](dict.keys)
var array2 = [String](dict.values)

上述三种集合与OC中的三种集合都有桥接,但是会出现诡异的问题,建议使用swift风格的集合类型

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

推荐阅读更多精彩内容

  • 前言 3月27号苹果发布了Swift3.1,官方教程也更新到了3.1,查看更新记录发现更新的内容对之前的文章并没有...
    BoomLee阅读 3,139评论 0 4
  • Swift 语言提供Arrays、Sets和Dictionaries三种基本的集合类型用来存储集合数据。数组(Ar...
    穷人家的孩纸阅读 567评论 3 2
  • Swift提供了三种基本集合类型:Arrays Sets Dictionaries用来储存集合数据,数组(Ar...
    edison0428阅读 304评论 0 0
  • 集合类型: Swift,和其他现代编程语言一样,有内置的集合类型数组(Array)和字典(Dictionary),...
    小松树先生阅读 1,108评论 0 2
  • 【1】不适合的圈子不要进去,因为那会让你无地自容 有天,我问j,你的圈子多吗?她说,不多,基本没有。我好奇,现在这...
    WOO梵馨怡miU阅读 1,434评论 3 4