swift中数组元素类型问题

本文深入探讨了Swift中数组的类型定义与初始化机制,解释了为何看似等效的初始化方式实则创建了不同类型的数组,并揭示了这些类型之间的细微差别。

在学习swift的过程中,偶然发现一些问题,而官方的《The Swift Programming Language》中并没有找到相关说明,在此记录一下。


问题是在创建空数组的时候发现的,我们知道在swift中,想要创建空数组,就必须为它指定一个类型,除非当前的上下文已经包含了类型,也即:

var array = []<span style="white-space:pre">	</span>//这样的初始化会报错
var array = [Int]()<span style="white-space:pre">	</span>//正确初始化一个类型为[Int]的空数组

或者当前上下文中已有类型说明时,可以直接创建空数组,例如:

</pre><pre name="code" class="plain">var array = ["1", "2"]<span style="white-space:pre">	</span>//array的类型已经被确定为[String]
array = []<span style="white-space:pre">		</span>//array为一个类型为[String]的空数组


而有的时候,我们想在数组中存放不同类型的数据,就像OC中的NSArray一样,这时,我们有几种方法来初始化一个这样的数组:

1.

var array = [1, "2"]<span style="white-space:pre">	</span>//创建时指定两个类型不同的字面量元素

2.

var array1 = [NSObject]()//创建一个空的数组

3.

var array2 = [1, "2", anyObject]//创建时指定不同类型的字面量元素,且其中包含任意一个类的实例

究竟要说明什么问题呢?

上三种方法,表面上都初始化成功了一个可以存放任意类型数据的数组,但是其实这三个数组的类型各不相同!

从Xcode的自动提示中可以印证这一点:


可以看到,方框中的三个数组array,array2和array3,其类型各不相同。

array是一个存放NSObject类型数据的数组,NSObject显然属于OC范畴,即这个数组中存放的是OC的对象。

array2则是[(NSObject)]类型,这种类型在The Swift Programming Language》中并没有说明,不知道与[NSObject]有何不同?

array3则直接变成了OC中的NSArray类型。

而以上的情况对于其它类型的数据也是一样的,会产生类似于[Int]和[(Int)]这样的数据类型,不知多了一个小括号之后有什么不一样的地方?


猜测在字典类型上也会出现类似情况,但是实际测试发现,字典并未出现这样的情况:








### 创建和初始化对象数组 Swift 中的数组可以存储任何类型的对象,包括自定义类的实例。定义一个对象数组时,可以使用标准的数组语法,并通过 `class` 或 `struct` 类型来指定数组元素的类型。例如: ```swift class Person { var name: String var age: Int init(name: String, age: Int) { self.name = name self.age = age } } let person1 = Person(name: "Alice", age: 30) let person2 = Person(name: "Bob", age: 25) let people = [person1, person2] ``` 上述代码定义了一个 `Person` 类,并创建了一个包含两个 `Person` 实例的数组 `people`,这展示了 Swift 数组如何存储对象[^3]。 ### 访问和修改对象数组 可以通过索引访问数组中的对象,并调用其属性或方法。例如: ```swift print(people[0].name) // 输出 "Alice" people[0].age = 31 print(people[0].age) // 输出 31 ``` Swift 数组支持常见的修改操作,如添加、删除或替换元素。例如,使用 `append` 方法向数组末尾添加新对象: ```swift let person3 = Person(name: "Charlie", age: 28) people.append(person3) ``` ### 对象数组的排序 可以通过 `sorted` 函数对对象数组进行排序。为了实现排序,需要提供一个闭包来定义排序逻辑。例如,按 `age` 属性升序排列: ```swift let sortedByAge = people.sorted { $0.age < $1.age } ``` 如果需要在多个地方使用相同的排序逻辑,可以将对象类型实现 `Comparable` 协议,以支持默认排序行为[^5]。 ### 对象数组的过滤和映射 可以使用 `filter` 和 `map` 方法对对象数组进行转换和筛选。例如,筛选出年龄大于 30 的对象: ```swift let olderThan30 = people.filter { $0.age > 30 } ``` 将对象数组映射为另一个数组,例如提取所有对象的 `name` 属性: ```swift let names = people.map { $0.name } ``` 这些操作基于 Swift 数组的函数式编程特性,能够高效地处理对象数组[^4]。 ### 对象数组的遍历 可以使用 `for...in` 循环遍历数组中的每个对象: ```swift for person in people { print("Name: $person.name), Age: $person.age)") } ``` 这种遍历方式依赖于 Swift 数组对 `Sequence` 协议的支持,确保数组可以被迭代[^4]。 ### 相关问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值