欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Swift 4.2之数据类型理解

程序员文章站 2024-03-23 12:54:10
...

 

 

Swift 提供了三种基本数据类型,包括数组、集合、字典,都可用于存储值集合。数组是值的有序集合。集合是无序值的唯一值集合。字典是关键值关联的无序集合。

 

Swift 4.2之数据类型理解

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 SpreadCheese ,和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索引的。然而,当count0时(意思是数组是空的)时,没有有效的索引。

当一个项被移除时,数组中的任何空隙都被关闭,因此索引0的值再次等于Six eggs

firstItem = shoppingList[0]
//  firstItem 现在等于 Six eggs 

如果要从数组中删除最后一个项,请使用removeLast()方法,而不使用remove(at:)方法来避免查询数组的count属性。类似于remove(at:)方法,removeLast()返回被删除的项。

let apples = shoppingList.removeLast()
//数组中的最后一个项刚刚被删除。
//  shoppingList 现在包含5个项目,没有苹果。
// 苹果常数现在等于移除的 Apples 串。

钟长森博客-Swift 4.2之数据类型理解 

相关标签: Swift4.2