Swift中的数组要求在创建时其存储的类型是确定的,这点与Oc中的数组有一些不同;

当然,这也不是绝对的,因为有时候数组可以使用范型来约束其类型,只需遵循相应的协议即可,类型并不是完全一致的.

Swift中的数组相比于Oc的数组,功能更加强大;使用更加简便;当然也更加复杂了(光是Array的代码就有9800多行)


1.数组的本质,查看官方的API可以知道数组实际上是一个 结构体.


struct Array<T> : MutableCollectionType,Sliceable {

    /// The type of element stored by this `Array`
    typealias Element = T

    /// Always zero,which is the index of the first element when non-empty.
    var startIndex: Int { get }

    /// A "past-the-end" element index; the successor of the last valid
    /// subscript argument.
    var endindex: Int { get }
    subscript (index: Int) -> T

    /// Return a *generator* over the elements.
    ///
    /// Complexity: O(1)
    func generate() -> IndexingGenerator<[T]>

    /// A type that can represent a sub-range of an `Array` 
    typealias SubSlice = Slice<T>
    subscript (subRange: Range<Int>) -> Slice<T>

    /// Initialization from an existing buffer does not have "array.init"
    /// semantics because the caller may retain an alias to buffer.
    init(_ buffer: _ArrayBuffer<T>)
}


可以看到数组的构成包括:范型类型,计算属性,下标,构造器等



2.声明数组的两种方式


(1)使用范型(学过java的应该不会陌生)来约束数组的类型


方式;

var arr :Array<类型>

var arr : Array<Int>

(2) 符号简写方式定义数组变量


方式:

var arr :[类型]

var arr2 :[String]


(3)定义隐式的数组类型,自动推断


方式:


var arr3 = [数组元素1,元素2,.....]

var arr3 = [1,2,3]

上述的arr3不用声明类型,系统可以自动推断为 Int类型


3.数组的创建方式


(1)使用系统提供的init()构造器


使用示例:

arr = Array<Int>()

( 2)使用init(count: 10,repeatedValue:2) 创建一个 个数为 count的,重复值为 repeatedValue的数组


示例,创建一个 元素个数为10,重复值的值为2的数组


arr = Array<Int>(count: 10,repeatedValue: 2)

(3)使用直接赋值法


var arr3 = [1,3]



4.数组的几种遍历方式


(1)利用 数组的count属性来遍历,count是数组元素的个数;并且使用数组的下标来访问数组中的元素


var arr3 = [1,3]


for var i = 0;i<arr3.count;i++
{
    
    arr3[i]+=1
    print(arr3[i])
}


(2)使用for in快速遍历


for elem in arr3
{
    println(elem)
}

注意: elem默认是 let常量类型的,不可修改 elem的值


5.数组的方法,数组这个结构体,通过拓展增加了很多方法:



extension Array {

    /// Construct an empty Array
    init()

    /// Construct from an arbitrary sequence with elements of type `T`
    init<S : SequenceType where T == T>(_ s: S)

    /// Construct a Array of `count` elements,each initialized to
    /// `repeatedValue`.
    init(count: Int,repeatedValue: T)

    /// How many elements the Array stores
    var count: Int { get }

    /// How many elements the `Array` can store without reallocation
    var capacity: Int { get }

    /// `true` if and only if the `Array` is empty
    var isEmpty: Bool { get }

    /// The first element,or `nil` if the array is empty
    var first: T? { get }

    /// The last element,or `nil` if the array is empty
    var last: T? { get }

    /// Reserve enough space to store minimumCapacity elements.
    ///
    /// PostCondition: `capacity >= minimumCapacity` and the array has
    /// mutable contiguous storage.
    ///
    /// Complexity: O(`count`)
    mutating func reserveCapacity(minimumCapacity: Int)

    /// Append newElement to the Array
    ///
    /// Complexity: amortized O(1) unless `self`'s storage is shared with another live array; O(`count`) if `self` does not wrap a bridged `NSArray`; otherwise the efficiency is unspecified.
    mutating func append(newElement: T)

    /// Append the elements of `newElements` to `self`.
    ///
    /// Complexity: O(*length of result*) 
    /// 
    mutating func extend<S : SequenceType where T == T>(newElements: S)

    /// Remove an element from the end of the Array in O(1).
    /// Requires: count > 0
    mutating func removeLast() -> T

    /// Insert `newElement` at index `i`.
    ///
    /// Requires: `i <= count`
    ///
    /// Complexity: O(\ `count`\ ).
    mutating func insert(newElement: T,atIndex i: Int)

    /// Remove and return the element at index `i`
    ///
    /// Invalidates all indices with respect to `self`.
    ///
    /// Complexity: O(\ `count`\ ).
    mutating func removeAtIndex(index: Int) -> T

    /// Remove all elements.
    ///
    /// Postcondition: `capacity == 0` iff `keepCapacity` is `false`.
    ///
    /// Complexity: O(\ `countElements(self)`\ ).
    mutating func removeAll(keepCapacity: Bool = default)

    /// Interpose `self` between each consecutive pair of `elements`,/// and concatenate the elements of the resulting sequence.  For
    /// example,`[-1,-2].join([[1,3],[4,5,6],[7,8,9]])`
    /// yields `[1,3,-1,-2,4,6,7,9]`
    func join<S : SequenceType where [T] == [T]>(elements: S) -> [T]

    /// Return the result of repeatedly calling `combine` with an
    /// accumulated value initialized to `initial` and each element of
    /// `self`,in turn,i.e. return
    /// `combine(combine(...combine(combine(initial,self[0]),/// self[1]),...self[count-2]),self[count-1])`.
    func reduce<U>(initial: U,combine: (U,T) -> U) -> U

    /// Sort `self` in-place according to `isOrderedBefore`.  Requires:
    /// `isOrderedBefore` induces a `strict weak ordering
    /// <http://en.wikipedia.org/wiki/Strict_weak_order#Strict_weak_orderings>`__
    /// over the elements.
    mutating func sort(isOrderedBefore: (T,T) -> Bool)

    /// Return a copy of `self` that has been sorted according to
    /// `isOrderedBefore`.  Requires: `isOrderedBefore` induces a
    /// `strict weak ordering
    /// <http://en.wikipedia.org/wiki/Strict_weak_order#Strict_weak_orderings>`__
    /// over the elements.
    func sorted(isOrderedBefore: (T,T) -> Bool) -> [T]

    /// Return an `Array` containing the results of calling
    /// `transform(x)` on each element `x` of `self`
    func map<U>(transform: (T) -> U) -> [U]

    /// A Array containing the elements of `self` in reverse order
    func reverse() -> [T]

    /// Return an `Array` containing the elements `x` of `self` for which
    /// `includeElement(x)` is `true`
    func filter(includeElement: (T) -> Bool) -> [T]
}


包括构造器,判空,排序,追加,移除等方法;方法使用简单,在此 只举一例:

使用append追加元素

var arr3 = [1,3]

arr3.append(4)
arr3.append(5)


for var i = 0;i<arr3.count;i++
{
    
    arr3[i]+=1
    print(arr3[i])
}


几点说明:

mutating func
这个 前缀,说明了该方法是可变的方法;原因是 数组 和Oc的数组,不一样;Swift中的数组是值类型的;在函数中的形参传入实参时,默认传入的是函数的副本,而无法直接修该该实参;故而出了可变方法,需要在 func之前加上 mutating 关键字.


6.数组的重载运算符+=的妙用


使用数组重载的运算符 += 我们可以直接对可变的数组 (使用 var 修饰) 追加另一个数组(注意,不是单个的元素)进来;从而把两个数组合二为一


var arr3:Array<Int> = [1,3]

var arr4 = [6,8]

arr3 += arr4

for var i = 0;i<arr3.count;i++
{
    
    arr3[i]+=1
    print(arr3[i])
}

arr3 数组 合并了 arr4 数组



7.数组的范围下标.我们可以对数组的下标取一个范围来访问数组中的某个范围的元素

对于范围不太理解的详见前面的Swift教程

(1)

方法:


var  arr2 = arr1[a...b]
var arr2 = arr1[a..<b]

取 arr1数组中下标为 a到 b的 元素,作为一个数组,放入到 arr2数组中;

注意:下标的范围 不要超过 count -1;避免发生 数组越界.


(2)对某个范围下标进行元素批量替换.


我们可以直接使用数组的范围下标来替换对应数组的多个元素,并且不需要关心前后改变的元素个数是否相等.数组 自动改变个数.


var arr3 = [0,1,6]

arr3[0...1] = [8,8]

println(arr3)

输出:
[8,6]

我们把 arr3数组对应 下标为 0和 1的元素,替换为 4个8;前后元素不一致,但是 数组可以自动改变元素的个数,并且插入到指定的位置.


(3)利用范围下标,快速清空数组


使用:

//清空 数组中的所有元素



arr[0...arr.count-1] = []  

详细示例:


var arr3 = [0,8]

println("清空数组之前: 数组是  \(arr3)")

arr3[0...arr3.count-1] = []

println("清空数组之后,数组是  :\(arr3)")

输出:
清空数组之前: 数组是  [8,6]
清空数组之后,数组是  :[]

可以看到数组中元素个数为0了.


8.多维数组.


定义一个二维数组:


var arr:[[类型]]

或者


var arr:Array<Array<类型>>


var arr :[[Int]]

arr = [[1,[5,7]]

println(arr[0][1])


var arr2:Array<Array<String>>
arr2 = Array<Array<String>>()

arr2.insert(["第一个","'第二个"],atIndex: 0)

println(arr2)

所谓数组类似,需要类型写法需要嵌套


9.数组的复制与引用类型.


数组复制的规律:

如果数组内的元素是值类型的,如整型,那么数组复制时,会把源数组复制出元素的副本;

如果数组内的元素是引用类型的,如对象,那么 数组复制时,只是复制出元素的指针,修改该指针则也会修改源数组的内容.


复制的形式,很简单,可以直接 使用 等于=,赋值符号 = 即可;


(1)值类型的赋值:

var arr1 = [1,3]

var arr2 = arr1

arr2[0] = 3
println(arr2)
println(arr1)
输出:
[3,3]
[1,3]

说明,arr2的修改对 arr1是没有影响的,此数组的复制为值类型的复制;


(2)引用类型的数组复制


首先创建一个有属性 aa的类A,并创建一个构造器


class A
{
    var aa:String
    init(aa:String)
    {
        self.aa = aa
    }
}


把 arr1复制给 arr2,然后,改变arr2的第一个元素的值
var arr1 = [A(aa:"aa1"),A(aa:"aa2")]
println(arr1[0].aa)
var arr2 = arr1
arr2[0].aa = "aa2来也"
println(arr1[0].aa)
println(arr2[0].aa)

输出:
aa1
aa2来也
aa2来也

可以看到,当修改 arr2的时候;arr1也被修改了.


Swift更多教程:http://www.jb51.cc/cata/272739

Swift教程12-数组的结构体本质,对比NSArray的更多相关文章

  1. html5使用canvas实现弹幕功能示例

    这篇文章主要介绍了html5使用canvas实现弹幕功能示例的相关资料,需要的朋友可以参考下

  2. 前端实现弹幕效果的方法总结(包含css3和canvas的实现方式)

    这篇文章主要介绍了前端实现弹幕效果的方法总结(包含css3和canvas的实现方式)的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  3. H5 canvas实现贪吃蛇小游戏

    本篇文章主要介绍了H5 canvas实现贪吃蛇小游戏,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  4. ios – parse.com用于键,预期字符串的无效类型,但是得到了数组

    我尝试将我的数据保存到parse.com.我已经预先在parse.com上创建了一个名为’SomeClass’的类.它有一个名为’mySpecialColumn’的列,其数据类型为String.这是我尝试使用以下代码保存数据的代码:如果我运行这个我得到:错误:密钥mySpecialColumn的无效类型,预期字符串,但得到数组这就是我在parse.com上的核心外观:有谁知道我为什么会收到这个错误?

  5. ios – Swift相当于`[NSDictionary initWithObjects:forKeys:]`

    Swift的原生字典是否与[NSDictionaryinitWithObjects:forKeys:]相当?假设我有两个带键和值的数组,并希望将它们放在字典中.在Objective-C中,我这样做:当然我可以通过两个数组迭代一个计数器,使用vardict:[String:Int]并逐步添加东西.但这似乎不是一个好的解决方案.使用zip和enumerate可能是同时迭代两者的更好方法.然而,这种方法

  6. ios – 上下文类型’NSFastEnumeration’不能与数组文字一起使用

    斯威夫特3,你会这样做吗?解决方法正如您所发现的,您不能使用as-casting将数组文字的类型指定为NSFastEnumeration.您需要找到一个符合NSFastEnumeration的正确类,在您的情况下它是NSArray.通常写这样的东西:

  7. ios – 在Swift中获取Cocoa Touch Framework项目版本字符串

    有谁知道这是否是我的项目设置中的缺陷,Xcode中的一个错误,或者是否有一种方法可以将Swift中的框架版本作为String或数组获取,这样我可以提供比major.minor更精细的版本控制?

  8. ios – 搜索数组swift中的对象

    我正在尝试使用UISearchController创建搜索功能.但是,我似乎无法使其与我的团队对象一起工作.我首先创建了一个包含id,name和shortname的TeamObject.然后我从一个url中检索teamData,并将TeamObjects添加到一个填充到tableView中的数组中.这个tableView包含一个searchController,它假设过滤数据,但没有任何反应.阵列

  9. ios – 获取资产目录文件夹中所有图像的数组

    在iOS中,是否可以获取资产目录文件夹中的图像数组?我不确定为什么会对此进行投票.我真的不知道从哪里开始.我的另一种方法是创建文件夹中所有文件的plist,但它似乎是多余的.我无法添加任何代码,因为我会添加什么?

  10. ios – Swift可选项:语言问题,还是做错了什么?

    应该有可选的类型;type是但是,如果我这样做,它的工作原理:它似乎是基本的替代,但我可能会遗漏一些语言的细微差别.谁能对此有所了解?之后就像暧昧一样,更多,这是我的解决方案:这适用于所有非对象Swift对象,包括Swift字符串,数字等.感谢Viktor提醒我String不是Swift中的对象.如果您知道值的类型,您可以替换任何?使用适当的可选类型,如String?

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部