Swift 基本知识点之二集合介绍

 在Swift中支持数组,集合,字典 跟OC一样
1 数组(Arrays)
数组使用有序列表存储同一类型的多个值。相同的值可以多次出现在一个数组的不同位置中。
(注意: Swift 的Array类型被桥接到Foundation中的NSArray类。)
1.1 数组的语法
写 Swift 数组应该遵循像Array<Element>这样的形式,其中Element是这个数组中唯一允许存在的数据类型。
例如:
1.1.1 创建一个空数组
var myEmptyArray = [Int]()//创建一个空数组
var myArray:Array<Int> = []//创建一个空数组
var myArr:Array<Int> = [1,2,3,4,5,6]//创建一个数组
print(myArr)--->[1, 2, 3, 4, 5, 6]
//往空数组里面添加一个元素
myEmptyArray.append(3)

1.1.2 创建一个带有默认值的数组
Swift 中的Array类型还提供一个可以创建特定大小并且所有数据都被默认的构造方法。我们可以把准备加入新数组的数据项数量(count)和适当类型的初始值(repeatedValue)传入数组构造函数:
var threeDoubles = [Double](count: 3, repeatedValue:0.0)
// threeDoubles 是一种 [Double] 数组,等价于 [0.0, 0.0, 0.0]

 1.1.3 通过两个数组相加创建一个数组,我们可以使用加法操作符(+)来组合两种已存在的相同类型数组
 var arr1:Array<Int> = [1,2,3,4,5]
var arr2:Array<Int> = [2,6]
var arr3:Array<Int> = arr1 + arr2//数组拼接


1.1.4 用字面量构造数组 我们可以使用字面量来进行数组构造,这是一种用一个或者多个数值构造数组的简单方法。字面量是一系列由逗号分割并由方括号包含的数值:
[value 1, value 2, value 3]。
下面这个例子创建了一个叫做shoppingList并且存储String的数组:
var shoppingList: [String] = ["Eggs", "Milk"]
或写成
var shoppingList = ["Eggs", "Milk"]
这是由于 Swift 的类型推断机制,当我们用字面量构造只拥有相同类型值数组的时候,我们不必把数组的类型定义清楚。
Shoppinglist数组被声明为变量(var关键字创建)而不是常量(let创建)是因为以后可能会有更多的数据项被插入其中。

(1)获取数组的个数
print(shoppinglist.count)--->>2
(2)判断数组是否为empty
if shoppinglist.isEmpty{
    print("shoppinglist is empty")
}else{
    print("shoppinglist is not empty")
}
(3)往数组添加元素
shoppinglist.append("csdsv")
//除此之外,使用加法赋值运算符(+=)也可以直接在数组后面添加一个或多个拥有相同类型的数据项:
shoppinglist += ["cdc","sd"]
(4)获取数组中的某个元素
var fistitem = shoppinglist[0]
(注意:第一项在数组中的索引值是0而不是1。 Swift 中的数组索引总是从零开始.) 
(5)根据索引来改变数组中某个值
shoppinglist[2] = "cdvdsvfvfb"
(6) 还可以利用下标来一次改变一系列数据值,即使新数据和原有数据的数量是不一样的
shoppinglist[2...3] = ["12","34"]
(7)在相应的坐标下插入数据
shoppinglist.insert("56", atIndex: 0)
(8)根据下标来删除数据
shoppinglist.removeAtIndex(0)
(9)removeAll() 等等操作

(10)数组的遍历
方法一 我们可以使用for-in循环来遍历所有数组中的数据项:
for item in shoppinglist{
    print(item)
}
得到各个元素

方法二 如果我们同时需要每个数据项的值和索引值,可以使用enumerate()方法来进行数组遍历。enumerate()返回一个由每一个数据项索引值和数据值组成的元组。我们可以把这个元组分解成临时常量或者变量来进行遍历:
for (index,value) in shoppinglist.enumerate(){
    print("\(value)")
}
两种方法最后的效果都是一样的
2 集合(Set)
集合(Set)用来存储相同类型并且没有确定顺序的值。当集合元素顺序不重要时或者希望确保每个元素只出现一次时可以使用集合而不是数组。
注意:
Swift的Set类型被桥接到Foundation中的NSSet类。
关于使用Foundation和Cocoa中Set的知识,请看 Using Swift with Cocoa and Objective-C。

集合类型的哈希值

   一个类型为了存储在集合中,该类型必须是可哈希化的--也就是说,该类型必须提供一个方法来计算它的哈希值。一个哈希值是Int类型的,相等的对象哈希值必须相同,比如a==b,因此必须a.hashValue == b.hashValue。
   Swift 的所有基本类型(比如String,Int,Double和Bool)默认都是可哈希化的,可以作为集合的值的类型或者字典的键的类型。没有关联值的枚举成员值(在枚举有讲述)默认也是可哈希化的。
   *注意:
你可以使用你自定义的类型作为集合的值的类型或者是字典的键的类型,但你需要使你的自定义类型符合 Swift 标准库中的Hashable协议。符合Hashable协议的类型需要提供一个类型为Int的可读属性hashValue。由类型的hashValue属性返回的值不需要在同一程序的不同执行周期或者不同程序之间保持相同。
因为Hashable协议符合Equatable协议,所以符合该协议的类型也必须提供一个"是否相等"运算符(==)的实现。这个Equatable协议要求任何符合==实现的实例间都是一种相等的关系。也就是说,对于a,b,c三个值来说,==的实现必须满足下面三种情况:
a == a(自反性)
a == b意味着b == a(对称性)
a == b && b == c意味着a == c(传递性)*
2.1 集合类型的语法
//1 初始化一个空的集合
var letters = Set<Character>()
var set:Set<String> = Set()
var lett:Set<Int> = [1,2,3,4]

//2 添加数据
set.insert("22")
//3 字面量的创建
var myset:Set<String> = ["history","math","chinese"]
var myset1:Set = ["book","Classical"]
2.2
访问和修改一个集合

你可以通过Set的属性和方法来访问和修改一个Set。

为了找出一个Set中元素的数量,可以使用其只读属性count:

print("I have \(favoriteGenres.count) favorite music genres.")
// 打印 "I have 3 favorite music genres."
使用布尔属性isEmpty作为一个缩写形式去检查count属性是否为0:

if favoriteGenres.isEmpty {
    print("As far as music goes, I'm not picky.")
} else {
    print("I have particular music preferences.")
}
// 打印 "I have particular music preferences."
你可以通过调用Set的insert(_:)方法来添加一个新元素:

favoriteGenres.insert("Jazz")
// favoriteGenres 现在包含4个元素
你可以通过调用Set的remove(_:)方法去删除一个元素,如果该值是该Set的一个元素则删除该元素并且返回被删除的元素值,否则如果该Set不包含该值,则返回nil。另外,Set中的所有元素可以通过它的removeAll()方法删除。

if let removedGenre = favoriteGenres.remove("Rock") {
    print("\(removedGenre)? I'm over it.")
} else {
    print("I never much cared for that.")
}
// 打印 "Rock? I'm over it."
使用contains(_:)方法去检查Set中是否包含一个特定的值:

if favoriteGenres.contains("Funk") {
    print("I get up on the good foot.")
} else {
    print("It's too funky in here.")
}
// 打印 "It's too funky in here."

2.3 集合操作
下面的插图描述了两个集合-a和b-以及通过阴影部分的区域显示集合各种操作的结果。

这里写图片描述

let oddDigits: Set = [1, 3, 5, 7, 9] let evenDigits: Set = [0, 2, 4, 6, 8] let singleDigitPrimeNumbers: Set = [2, 3, 5, 7] oddDigits.union(evenDigits).sort() // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] oddDigits.intersect(evenDigits).sort() // [] oddDigits.subtract(singleDigitPrimeNumbers).sort() // [1, 9] oddDigits.exclusiveOr(singleDigitPrimeNumbers).sort() // [1, 2, 9]

集合成员关系和相等
下面的插图描述了三个集合-a,b和c,以及通过重叠区域表述集合间共享的元素。集合a是集合b的父集合,因为a包含了b中所有的元素,相反的,集合b是集合a的子集合,因为属于b的元素也被a包含。集合b和集合c彼此不关联,因为它们之间没有共同的元素。

这里写图片描述

使用“是否相等”运算符(==)来判断两个集合是否包含全部相同的值。
使用isSubsetOf(_:)方法来判断一个集合中的值是否也被包含在另外一个集合中。
使用isSupersetOf(_:)方法来判断一个集合中包含另一个集合中所有的值。
使用isStrictSubsetOf(_:)或者isStrictSupersetOf(_:)方法来判断一个集合是否是另外一个集合的子集合或者父集合并且两个集合并不相等。
使用isDisjointWith(_:)方法来判断两个集合是否不含有相同的值(是否没有交集)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

图解AI

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值