Swift 4.2之数据类型理解
Swift 提供了三种基本数据类型,包括数组、集合、字典,都可用于存储值集合。数组是值的有序集合。集合是无序值的唯一值集合。字典是关键值关联的无序集合。
Swift 中的数组、集合、字典对它们可以存储的值和键值的类型都是十分严格的。因此您不能随意将错误的数据类型值插入到集合中。同时也保证了对从集合筛选的值准确无误。
注释
Swift 中的数组、集合、字典类型都是*泛型集合。 泛型.
集合的可变性
如果创建数组、集合或字典,并将其赋值给变量,则所创建的集合将是可变的。这意味着,在集合中添加、删除或更改集合后,可以更改集合。如果将数组、集合或字典赋给常量,则集合为不可变,并且其大小和内容不能更改。
注释
在不需要更改集合的所有情况下,创建不可变集合是一种很好的做法。这样做可以使您更容易对代码进行理解分析,并使 Swift 编译器能够优化所创建的集合的性能。
数组
数组在有序列表中存储相同类型的值。相同的值可以在数组中多次出现在不同的位置。
注释
Swift 中的
数组
类型被归纳到基础的不可变数组
分类里。有关如何使用基础数组和Cocoa中的更多信息,请参阅 数组和不可变数组之间的桥接.
数组类型速记语法
Swift 数组的类型被完整地写为数组<元素>
,其中Element
是数组允许存储的值类型。您还可以用Element
写一个数组的形式。虽然这两种形式在功能上是相同的,但在引用数组的类型时,最好使用缩写形式。
创建空数组
可以使用初始化器语法创建某种类型的空数组:
var someInts = [Int]()
print("someInts is of type [Int] with \(someInts.count) items.")
// 打印某些类型为「Int」的0个项目
注释,从初始化器的类型推断 SomeInts
变量的类型为 Int
。
或者,如果上下文已经提供了类型信息,例如函数参数或已经键入的变量或常量,则可以创建一个空数组,该数组具有空数组文字,写为 []
(一对空的方括号):
someInts.append(3)
// 现在包含1个int类型的值
someInts = []
//
某些对象现在是空数组,但仍然是「Int」类型。
创建具有默认值的数组
Swift 的Array
类型还提供了一个初始化器,用于创建一个特定大小的数组,所有的值都设置为相同的默认值。通过这个初始化器,一个适当类型的默认值(称为 repeating
):在新数组中重复该值的次数(称为 count
):
var threeDoubles = Array(repeating: 0.0, count: 3)
// threeDoubles是[Double]类型,等于[ 0,0,0 ]。
通过添加两个数组一起创建数组
可以通过添加两个具有兼容运算符类型的现有数组( +
)来创建一个新数组。新数组的类型是从两个数组中添加的类型合成的:
var anotherThreeDoubles = Array(repeating: 2.5, count: 3)
// anotherThreeDoubles是 [Double]类型, 等于 [2.5, 2.5, 2.5]
var sixDoubles = threeDoubles + anotherThreeDoubles
// sixDoubles最终还是 [Double]类型, 等于 [0.0, 0.0, 0.0, 2.5, 2.5, 2.5]
创建一个数组名为Array Literal的数组
还可以用一个数组Array Literal初始化一个数组,这是将一个或多个值写入数组集合的快捷方式。Array Literal是一个可以写入一个或多个值列表,用逗号分隔,由一对方括号包围:
[value 1, value 2, value 3]
下面的示例创建一个名为 shoppingList
的数组来存储String
值:
var shoppingList: [String] = ["Eggs", "Milk"]
// shoppingList 初始化了两个初始项
shoppingList
变量被声明为 字符串值数组
,写为 [String ]
。因为这个特定的数组已经指定了一个 string
的值类型,所以它只允许存储 String
值。这里, shoppingList
数组用两个 String
值( Eggs
和 Milk
)初始化,在数组文字中写入。
注释
shoppingList
数组被声明为变量(用var
声明)而不是常数(用let
」声明),因为在下面的例子中,更多的项目被添加到 shoppingList 中。
在这种情况下,Array Literal 包含两个String
值,而没有其他的值。这与shoppingList
变量的声明类型(一个只能包含String
值的数组)相匹配,因此允许Array Literal中的赋值作为初始化两个初始项的shoppingList
的方式。
多亏了 Swift 的类型推断,如果你用一个包含相同类型的值的数组文字来初始化数组,就不必编写数组的类型。shoppingList
的初始化可以用更短的形式来写:
var shoppingList = ["Eggs", "Milk"]
因为数组文本中的所有值都是相同的类型,所以 Swift 可以推断,[String ]
是用于shoppingList
变量的正确类型。
访问和修改数组
通过它的方法和属性或使用下标语法来访问和修改数组。
若要查找数组中的项数,请检查其只读count
属性:
print("The shopping list contains \(shoppingList.count) items.")
// 打印shopping List 包含2个项目。
使用布尔isEmpty
属性作为检查count
属性是否等于0
的捷径:
if shoppingList.isEmpty {
print("The shopping list is empty.")
} else {
print("The shopping list is not empty.")
}
// 打印 shopping List 不为空。
您可以通过调用数组的append(_:)
方法来向数组的末尾添加一个新项:
shoppingList.append("Flour")
// shopping List 现在包含了3个项目,有人在做煎饼。
或者,用加法赋值运算符追加一个或多个兼容项的数组。 (+=
):
shoppingList += ["Baking Powder"]
// shoppingList 现在包含4个项目
shoppingList += ["Chocolate Spread", "Cheese", "Butter"]
// shoppingList 现在包含7个项目
通过使用*下标语法从数组中检索值,在数组名称后面立即传递要在方括号内检索的值的索引:
var firstItem = shoppingList[0]
// firstItem 等于Eggs
注释
数组中的第一个项的索引为
0
,而不是1
。 Swift 中的数组始终是零索引的。
可以使用下标语法更改给定索引中的现有值:
shoppingList[0] = "Six eggs"
// shoppingList中的第一个项目现在等于「Six eggs」而不是「eggs」。
当使用下标语法时,指定的索引必须是有效的。例如,写shoppingList[shoppingList.count]=Heal
试图将一个项追加到数组的末尾会导致运行时错误。
您也可以使用下标语法来同时更改一系列值,即使替换值集的长度与所替换的范围不同。下面的例子取代了Chocolate Spread
,Cheese
,和Butter
和Bananas
和Apples
:
shoppingList[4...6] = ["Bananas", "Apples"]
// shoppingList现在包含6个项目
若要将项插入到指定索引的数组中,请调用数组中的 insert(_:at:)
方法:
shoppingList.insert("Maple Syrup", at: 0)
// shoppingList 现在包含7个项目
// 「 Maple Syrup 」现在是名单上的第一项。
在 insert(_:at:)
方法调用插入了一个新的项目,其值为Maple Syrup
,在shopping List
的开头,用0
的索引表示。
类似地,用remove(at:)
方法移除数组中的项。此方法移除指定索引处的项并返回被删除的项(尽管如果不需要返回值,则可以忽略该值):
let mapleSyrup = shoppingList.remove(at: 0)
// 索引0中的项刚刚被删除。
// shoppingList 现在包含了6个项目,没有 Maple Syrup 。
// mapleSyrup 常数现在等于去除的 Maple Syrup 字符串。
注释
如果您试图访问或修改数组现有边界之外的索引的值,则会触发运行时错误。在将索引与数组的
count
属性进行比较之前,可以检查索引是否有效。数组中最大的有效索引是count -1
,因为数组是从0索引的。然而,当count
是0
时(意思是数组是空的)时,没有有效的索引。
当一个项被移除时,数组中的任何空隙都被关闭,因此索引0
的值再次等于Six eggs
:
firstItem = shoppingList[0]
// firstItem 现在等于 Six eggs
如果要从数组中删除最后一个项,请使用removeLast()
方法,而不使用remove(at:)
方法来避免查询数组的count
属性。类似于remove(at:)
方法,removeLast()
返回被删除的项。
let apples = shoppingList.removeLast()
//数组中的最后一个项刚刚被删除。
// shoppingList 现在包含5个项目,没有苹果。
// 苹果常数现在等于移除的 Apples 串。
上一篇: redis 简介