swift 集合类型

数组

数组的简单语法

写swift数组应该遵循像Array<Element> 这样的形式,其中Element是这个数组中唯一允许存在的数据类型。我们也可以使用像[Element]这样的简单语法。尽管两种形式在功能上是一样的,但是推荐剪短的那种,而且在本文中都会使用这种形式来使用数组。

创建一个空数组

可以使用构造语法来创建一个由特定数据类型构成的空数组:
var someInts = [Int]()
通过构造函数的类型,someInts的值类型被推断为[Int]。
如果代码上下文中已经提供了类型信息,例如一个函数参数或者一个已经定义好类型的常量或者变量,我们可以使用空数组语句创建一个空数组,它的写法很简单:
someInts = []

创建一个带有默认值的数组

swift中的Array类型还提供一个可以创建特定大小并且所有数据都被默认的构造方法。我们可以把准备加入新数组的数据项数量和适当类型的初始值传入数组构造函数:
var threeDoubles = Array(repeating:0,count:3)

通过两个数组相加创建一个数组

可以使用加法操作符来组合两种已存在的相同类型数组。
  var anotherThreeDoubles = Array(repeating:2,count:3)
  var sixDoubles = threeDoubles + anotherThreeDoubles

用数组字面量构造数组

可以使用数组字面量来进行数组构造,这是一种用一个或者多个数值构造数组的简单方法。数组字面量是一系列由逗号分割并由方括号包含的数值:
var shoppingList:[String] = ["Eggs","Milk"]
由于swift的类型推断机制,还可以这样写:
var shoppingList = ["Eggs","Milk"]

访问和修改数组

可以使用数组的只读属性count来获取数组中的数据项的数量。使用布尔属性isEmpty作为一个缩写形式去检查count属性是否为0.
也可以使用append(_:)方法在数组后面添加新的数据项:
shoppingList.append("flour")
除此之外,使用加法赋值运算符也可以直接在数组后面添加一个或者多个拥有相同类型的数据项:
shoppingList += ["baking powder"]
可以用下标来改变某个已有索引值对应的数据值:
shoppingList[0] = "six eggs"
还可以利用下标一次改变一系列数据值,即使新数据和原有数据的数量不一样。
shoppingList[1...3] = ["bananas","apples"]
调用数组的insert(_:at:)方法来在某个具体的索引值之前添加数据项:
shoppingList.insert("maple", at: 0)
可以用remove(at:)方法来移除数组中的某一项。这个方法吧数组在特定索引值中存储的数据项移除并且返回这个被移除的数据项:
let maple = shoppingList.remove(at: 0)

数组的遍历

可以用for-in循环来遍历所有数组中的数据项:
  for item in shoppingList {
            print(item)
        }

如果同时需要每个数据项的值和索引值,可以使用enumerated()方法来进行数组遍历。enumerated()返回一个由每一个数据项索引值和数据值组成的元组。可以把这个元组分解成临时常量或者变量来进行遍历:
 for (index,value) in shoppingList.enumerated() {
            print("Item \(String(index + 1)):\(value)")
        }

集合

集合类型语法

swift中的set类型被写为Set<Element>,这里的Element表示Set中允许存储的类型,和数组不同的是,集合没有等价的化简形式。

创建和构造一个空的集合

可以通过构造器语法创建一个特定类型的空集合:
var letters = Set<Character>()

用数组字面量创建集合

可以使用数组字面量来构造集合,并且可以使用简化形式写一个或者多个值作为集合元素。
var favoriteGenres:Set<String> = ["Rock","Classical","Hip hop"]
一个Set类型不能从数组字面量中被单独推断出来,因此Set类型必须显示声明。然而,由于swift的类型推断功能,如果你想使用一个数组字面量构造一个Set并且该数组字面量中的所有元素类型相同那么你无需写出Set的具体类型。
var favoriteGenres:Set = ["Rock","Classical","Hip hop"]

访问和修改一个集合

可以使用只读属性count。使用布尔属性作为一个缩写形式去检查count属性是否为0.可以通过调用Set的insert(_:)方法来添加一个新元素:
favoriteGenres.insert("Jazz")
可以通过调用Set的remove(_:)方法去删除一个元素,如果该值是该Set的一个元素则删除该元素并且返回被删除的元素值,否则如果该Set不包含该值,则返回nil。
let removedGenre = favoriteGenres.remove("Rock")
使用contains(_:)方法去检查Set中是否包含一个特定的值:
  if favoriteGenres.contains("Funk") {
            
        }

遍历一个集合

可以在一个for-in循环中遍历一个Set中的所有值。
  for genre in favoriteGenres {
            
        }
swift的Set类型没有确定的顺序,为了按照特定顺序来遍历一个Set中的值可以使用sorted()方法,他将返回一个有序数组,这个数组的元素排列顺序由操作符<对元素进行比较的结果来确定。
   for genre in favoriteGenres.sorted() {
            
        }

集合操作

集合基本操作
使用intersection(_:)方法根据两个集合中都包含的值创建的一个新的集合。
使用symmetricDifference(_:)方法根据在一个集合中但不在两个集合中的值创建一个新的集合。
使用union(_:)方法根据两个集合的值创建一个新的集合。
使用subtracting(_:)方法根据不在该集合中的值创建一个新的集合。
 let oddDigits:Set = [1,3,5,7,9]
        let evenDigits:Set = [0,2,4,6,8]
        let singleDigitPrimeNumers:Set = [2,3,5,7]
        
        oddDigits.union(evenDigits).sorted()
        oddDigits.intersection(evenDigits).sorted()
        oddDigits.subtracting(singleDigitPrimeNumers).sorted()
        oddDigits.symmetricDifference(singleDigitPrimeNumers).sorted()

集合成员关系和相等

使用“是否相等”运算符来判断两个集合是否包含全部相同的值。
使用isSubset(of:)方法来判断一个集合中的值是否也被包含另一个集合中。
使用isSuperset(of:)方法来判断一个集合中包含另一个集合中所有的值。
使用isStrictSubset(of:)或者isStrictSuperset(of:)方法来判断一个集合是否是另外一个集合的子集合或者父集合并且两个集合并不相等。
使用isDisjint(with:)方法来判断两个集合是否不含有相同的值。

 let houseAnimals:Set = ["?","?"]
        let farmAnimals:Set = ["?","?","?","?","?"]
        let cityAnimals:Set = ["?","?"]
        
        houseAnimals.isSubset(of: farmAnimals)
        farmAnimals.isSuperset(of: houseAnimals)
        farmAnimals.isDisjoint(with: cityAnimals

字典

字典类型简化语法

swift的字典使用Dictionary<Key,Value>定义,其中Key是字典中键的数据类型,Value是字典中对应于这些键所存储值的数据类型。我们也可以用[Key:Value]这样简化的形式去创建一个字典类型。虽然这两种形式功能上相同,但是后者是首选。

创建一个空字典

可以像数组一样使用结构语法创建一个拥有确定类型的空字典:
var namesOfIntegers = [Int: String]()

用字典字面量创建字典

var airports:[String:String] = ["YYZ":"Toronto","DUB":"Dublin"]
也可以这样:
var airports: = ["YYZ":"Toronto","DUB":"Dublin"]
因为这个语句中所有的键和值都各自拥有相同的数据类型,swift可以推断出Dictionary<String,String>是airports字典的正确类型。

访问和修改字典

可以通过字典的方法和属性来访问和修改字典,或者通过使用下标语法。可以通过字典的只读属性count来获取某个字典的数据项数量。使用布尔属性isEmpty作为一个缩写形式去检查count属性是否为0.
如果有值存在于更新前,则这个可选值包含了旧值,否则他将会是nil。
 if let oldValue = airports.updateValue("Dublin Airport", forKey: "BUB")
        {
            
        }
也可以使用下标语法来在字典中检索特定键对应的值。因为有可能请求的键没有对应的值存在,字典的下标访问会返回对应值的类型的可选值。如果这个字典包含请求键所对应的值,下标会返回一个包含这个存在值的可选值,否则将返回nil。
if let airportName = airports["DUB"]{
            
        }
此外,也可以用来在字典中移除键值对。
 if let removedValue = airports.removeValue(forKey: "DUB"){
            
        }

字典遍历

可以使用for-in循环来遍历某个字典中的键值对。每一个字典中的数据项都以(key,value)元组形式返回,并且我们可以使用临时常量或者变量来分解这些元组:
 for (airportCode,airportName) in airports {
            
        }
通过访问keys或者values属性,也可以变量字典的键或者值:
        for airportCode in airports.keys {
            
        }
        
        for airportName in airports.values {
            
        }

取自《the swift programming language》中文版
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值