[Swift] 数组恒等 === 的 bug?!

Swift 中的数组是由结构体实现的:

struct Array<T> : MutableCollection, Sliceable {
    typealias Element = T
    var startIndex: Int { get }
    var endIndex: Int { get }
    subscript (index: Int) -> T
    func generate() -> IndexingGenerator<T[]>
    typealias SliceType = Slice<T>
    subscript (subRange: Range<Int>) -> Slice<T>
    init(_ buffer: ArrayBuffer<T>)
}

由上面的代码可以猜到,数组自身是不存放元素的,数组持有一个存放元素的 buffer(元素存储区)。

而数组的恒等 === 在文档中是这么说的:

Check whether two arrays or subarrays share the same storage and elements by comparing them with the identity operators (=== and !==).

数组的恒等 === 判断即判断两个数组所指向的元素存储区是否相同。

但 XCode 6 Beta 测试下来,结果大为迥异:

var a = [1, 2, 3]
var b = a
var c = a

println("a === a: \(a === a), b === c: \(b === c)");

结果为:

a === a: false, b === c: false

这应该是编译器的一个 BUG。

[Swift] 数组恒等 === 的 bug?!

时间: 2024-10-17 10:10:47

[Swift] 数组恒等 === 的 bug?!的相关文章

Swift 数组、字符串、集合与字典详解

今天我们来看几个最基本的数据结构:数组,字符串,集合和字典. 数组 数组是最基本的数据结构.Swift编程语言中改变了以前Objective-C时代NSMutableArray和NSArray分开的做法,统一到了Array唯一的数据结构.下面是最基本的一些实现. 1 2 3 4 5 6 7 8 9 10 11 // 声明一个不可修改的数组 let nums = [1, 2, 3] let nums = [Int](count: 5, repeatedValue: 0) // 声明一个可以修改的数

Swift 数组和字典

数组: 中括号[ ] 表示,数组值之间用逗号分隔 1.如果数组声明为常量,则本身不能修改,且数组中的值也不能修改 2.指定数组的类型,语法:Array<Type> 可以简写为 [Type] var typeArray1: [String] var typeArray1: Array<Int> = [1, 2, 3] 3.如果声明了数组,但是没有初始化该数组,是不能被引用的 var typeArray1: [String] println(typeArray1)  出错!! 4.当检

学习Swift -- 数组(Array) - 持续更新

集合类型--数组 Array是Swift中的一种集合类型:数组,数组是使用有序列表储存同一类型的多个值,与OC的NSArray的最大不同是,Swift的数组是值类型,OC的数组是引用类型 声明数组的方法 // 如果声明可变数组 就设置为变量 var someMutableArray = [Int]() // 声明了空数组 类型为Int // 相反声明不可变数组就设置为常量 let someArray = Array(count: 5, repeatedValue: 0.03) // 声明了一个不

【Swift初见】Swift数组(二)

在苹果的开发文档中对Array还提供了其它的操作算法: 1.Sort函数: 对数组进行排序.依据指定的排序规则,看以下的代码: var array = [2, 3, 4, 5] array.sort{$0 < $1} println(array) 此时打印出:[2, 3, 4, 5] 事实上sort大括号中面是一个闭包,这个以后再学习. 假设倒叙排列,代码例如以下: array.sort{$0 > $1} println(array) 输出为:[5, 4, 3, 2] 2.reverse函数

【Swift初见】Swift数组

在Objective-C中数组是常用的数据类型,在Swift中同样如此,在OC中有NSArray与NSMutableArray之分,但是在Swift中只有通过let和var来区分数组是否可变,Swift中的数组是类型安全的,所以在某个数据被存入到某个数组之前类型必须明确,假如我们创建了一个String类型的数组,那么该数组中就不能添加非String的数据类型,这是Swift与OC的一个很重要的区别. 数组的构造 我们以创建一个数组并存储Int类型的数组为例: var array = [2, 3,

swift数组

//: Playground - noun: a place where people can play import UIKit //------数组----------// //数组强调的有序,而不是数组中的元素是否重复 //Swift中的数组必须确定里面存储何种类型的数据,且一个数组只能存储相同类型的数据 let devices : [String] = ["iPhone", "iPad", "Mac"] print(devices) //

Swift 数组的常用操作

//数组 /* * Swift 要求一个数组要能正常使用 得满足两点 * 1,数组一定要初始化,初始化时可以赋值,也可以直接=[] 表示一个空数组 * * 2,必须要指定数据类型,可以通过赋值的方式让编译器自动识别数据类型,也可以自己指定. * */ // 我们试一下 var testArray1=[]; testArray1.append(11) 此处由于违反了 第二条没有指定数据类型,所以是错的 var testArray2:[String] testArray2.append("test&

Swift数组的存取与修改

1 对数组的存取与修改可以通过数组的方法和属性来进行,或者使用数组的下标语法. 2 3 要知道数组中元素的数量,可以查看它的只读属性count: 4 println("The shopping list contains \(shoppingList.count) items.") 5 // 输出“The shopping list contains 2 items.” 6 使用Boolean型的isEmpty属性,可以快速检查count属性是否为0: 7 if shoppingLis

Swift数组字面量

1 可以用一个数组字面量来初始化一个数组,简单地把一个或多个值放在一起就可以了.数组字面量的写法是一行用逗号隔开的值,并在行的两端用一对方括号包起来: 2 [value 1, value 2, value 3] 3 4 下面的例子创建了一个存放String类型值,名为shoppingList的数组: 5 var shoppingList: String[] = ["Eggs", "Milk"] 6 // shoppingList 用两个元素完成初始化 7 根据Str