swift之Array

这几天用swift发现应该仔细研究一下Array---于是找出了手册看了下,发现了一些东西

不知道从什么版本开始

Swift’sArray type now has full value semantics. Updated the information about Mutability of Collections and Arrays to reflect the new approach. Also clarified the Assignment and Copy Behavior for Strings, Arrays, and Dictionaries.

Array类型成为了数值类型,由结构来实现,所以在赋值或者作为参数传递的时候会拷贝一个全新的数值,而不像类一样,仅仅只是传递了一个引用 , 所以array也就没有了前面版本的unshare和copy方法

恩,就是这样的

然后

The value of an array includes the values of all of its elements. Copying an array also copies all of the elements of that array that are value types. This means that changing one of the elements of an array does not change the elements of any of the copies of the array. For example
意思就是由于Array变成了数值类型,当Array中某个元素被换掉之后,其copyArray是不会变的,保持原来对象

var array = [1, 2, 3]
var arrayCopy = array
array[0] = 100
// array is [100, 2, 3]
// arrayCopy is [1, 2, 3]

If the elements in an array are instances of classes, changing the class does affect other copies, because classes have reference semantics. For example:

class ExampleClass { var value = 10 }
var array = [ExampleClass(), ExampleClass()]
var arrayCopy = array
 
// Changing the class instance effects it in both places  改变数组元素中类的属性会影响COPY数组
array[0].value = 100
// arrayCopy[0].value is also 100
 
// Changing the elements of the array effects only one place 而改变数组的元素却不会
array[0] = ExampleClass()
// array[0].value is 10
// arrayCopy[0].value is 100

由于Arr变成了数值类型所以用for in循环是修改没法修改数组元素的,但是如果数组元素是类的话,可以修改类中的属性

var appleArr = [Apple(),Apple()]

for x:Apple in appleArr{
    x.name = "modify"
}
print("\(appleArr[0].name)---\(appleArr[1].name)--")  //modify


var strArr:[String] = ["a","b"]
for var x:String in strArr{
    x = "modify"
}
print("\(strArr)---\(strArr)--") //  [a,b]


Every array has a region of memory which stores the content of the array. If the array’s Element type is not a class or @objc protocol type, this storage is a contiguous block of memory; otherwise, this storage can be a contiguous block of memory, an instance of NSArray, or an instance of an NSArray subclass.
如果数组元素不是OBC的对象的话,那么其内存地址是连续的,反之,则有可能不是连续的

When an array’s storage is full, it allocates a larger region of memory and copies its elements into the new storage. The new storage is allocated to be a multiple of size of the old storage. This exponential growth strategy means that appending an element happens in constant time, averaging the performance of many append operations—append operations that trigger reallocation have a performance cost, but they occur less and less often as the array grows larger.

If you know approximately how many elements you will need to store, use the reserveCapacity(:) method before appending to the array to avoid the intermediate reallocations. Use the capacity and count properties to determine how many more elements the array can store without allocating a larger storage.
总的来说,append一个元素的时间是固定的,但是多个元素的添加代价是幂级数增长,增加元素意味着需要从新开辟更大的内存,swift将原来内存的元素复制过去,所以手册建议尽量在数组建立的时候就确定其长度,从而可以避免一些开销,如果要添加多个元素首先应该使用reserveCapacity(
:)一次性分配好内存,可以避免中间的内存重新分配(因为如果多个元素依次添加的话,可能会经历很多次reallocation过程)

#不好的做法
var appendArr:[String] = ["c","d","e"]

var strArr:[String] = ["a","b"]

for var x in appendArr{
   strArr.append(x)
}

print("\(strArr)")

#好的做法

var appendArr:[String] = ["c","d","e"]

var strArr:[String] = ["a","b"]

strArr.reserveCapacity(strArr.capacity+appendArr.capacity)
strArr.appendContentsOf(appendArr)
print("\(strArr)")

Bridging Between Array and NSArray
You can bridge between Array and NSArray using the as operator. All of the elements of the array must be bridged to Foundation types for the array to be bridged.

Bridging from Array to NSArray takes constant time and space if the array’s elements are instances of a class or an @objc protocol; otherwise, it takes linear time and space.

意思就是ARRAY和NSarray的转换 采用AS符号 ,如果元素是OBJ类实例的话会消耗固定时间,如果不是的话,会花费线性时间。

var strArr:[String] = ["a","b"]
let s = (strArr as NSArray).objectAtIndex(0)
print("\(s)")

Bridging from NSArray to Array first calls the copyWithZone: method on the array to get an immutable copy of the array, which takes linear time for most mutable subclasses of NSArray, and then performs additional Swift bookkeeping work, which takes constant time. However, if the instance of NSArray is already immutable, its implementation of copyWithZone: returns the same array in constant time. The instances of NSArray and Array share storage using the same copy-on-write optimization that is used when two instances of Array share storage.

从NSarray到Array的转换 会调用copyWithZone方法,获得一个不可变的数组,如果元素是可变的(obj类的实例)则会花费线性时间,如果元素是不可变的,则花费固定时间,,并且两个会共享存储空间。

The ContiguousArray class is not bridged; its instances always have a contiguous block of memory as their storage.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,711评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,079评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,194评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,089评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,197评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,306评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,338评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,119评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,541评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,846评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,014评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,694评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,322评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,026评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,257评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,863评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,895评论 2 351

推荐阅读更多精彩内容

  • **2014真题Directions:Read the following text. Choose the be...
    又是夜半惊坐起阅读 9,444评论 0 23
  • 我一直都知道我是一个倾诉欲望的人,倾诉可以让人觉得自己可以被人理解,但是生活中不是很多人都可以倾诉,所以我决定随便...
    潘十七阅读 251评论 0 1
  • 真正爱你的人, 会在你落魄的时候,不离不弃, 会在你失踪的时候,焦躁不安。 真正爱你的人, 不会在你需要的时候,不...
    旋风那个小土豆阅读 281评论 0 3
  • 又过了千年,紫霞终于再见到他。 “至尊宝!” "孙...孙悟空?" 两声呼唤仿佛投进了不见底的深窟,丝毫回响都看不...
    慵庸阅读 415评论 0 0
  • 当写下这个标题时,觉得是不是切入点太大了,因为自己并非全能需求大咖,也不是要写专业的指导性文章,只是在读完一篇推文...
    沈帕蒂阅读 310评论 1 2