前言

	public struct Array<Element> : CollectionType, MutableCollectionType, _DestructorSafeContainer
public class NSArray : NSObject, NSCopying, NSMutableCopying, NSSecureCoding, NSFastEnumeration
  • 在 Swift 语言中,数据在被存储进某个数组之前,类型必须明确,且与数组其他元素类型相同。在 Swift 语言中的数组和 C 语言中的不同,Swift 语言中的数组是值类型的,不管是赋值还是当作参数传递,都只是维护他的拷贝。你可以放心的操作他的拷贝,因为你做的任何操作都不会反馈回它本身,这是值类型自身的规则。

1、Array 与 NSArray 的相互转换

  • Array 与 NSArray 之间可以相互转换。Array 转成 NSArray 时,数组中的各项元素被转换为 AnyObject 类型。NSArray 转换成 Array 时,数组中的各项元素也被转换为 AnyObject 类型。
	// Array 转 NSArray

		// Array 转换成 NSArray<AnyObject> 型
let nsArray1:NSArray = array // Array 转换成 NSArray<AnyObject> 型
let nsArray2:NSArray = array as NSArray // NSArray 转 Array // NSArray 转换成 Array<AnyObject> 型
let swiftArray1:Array = nsArray1 as Array // NSArray 转换成 Array<AnyObject> 型
let swiftArray2:Array = nsArray1 as [AnyObject] // NSArray 转换成 Array<Int> 型
let swiftArray3:Array = nsArray1 as! [Int]

2、数组的 创建

	// Array 型数组

		// 不赋初值,指定数组内数据为 String 型
let array1 = [String]() // 不赋初值,Array<String> 等价于 [String]
let array2 = Array<String>() // 不指定数组内数据类型,自动推断
let array3:Array = ["bei", "jing"] // 指定数组内数据类型为 String 型
let array4:Array<String> = ["huan", "ying", "ni"] // 不指定数组内数据类型,自动推断
let array5 = ["bei", "jing", "huan", "ying", "ni"] // 指定数组内数据类型为 Int 型
let array6:[Int] = [1, 2, 3, 4, 5, 6] // 指定数组内数据类型为 AnyObject 型
let array7:[AnyObject] = [1, 2, 3, 4, 5, 6, "happy"] // 创建二维数组
let array8:Array<Array<Int>> = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] // NSArray 型数组 let swiftArray:Array = ["bei", "jing", "nin", "hao"] let nsArray1:NSArray = swiftArray
let nsArray2:NSArray = swiftArray as NSArray let nsArray3 = NSArray() // array: [AnyObject]
let nsArray4 = NSArray(array: array7) // array: [AnyObject]
let nsArray6 = NSArray(array: ["bei", "jing", "huan", "ying", "ni"]) // array: NSArray
let nsArray5 = NSArray(array: nsArray2) // object: AnyObject
let nsArray7 = NSArray(object: "qian") // objects: AnyObject...
let nsArray8 = NSArray(objects: "bei", "jing", "huan", "ying", "ni") // 从 文件 创建字符串
let nsArray9:NSArray? = NSArray(contentsOfFile: NSHomeDirectory() + "/Desktop/test.txt") // 从 Url 创建字符串
let nsArray10:NSArray? = NSArray(contentsOfURL: NSURL(fileURLWithPath: NSHomeDirectory() + "/Desktop/test.txt"))

3、数组的 长度计算

	// Array 或 NSArray 型数组

		let array = ["bei", "jing", "huan", "ying", "ni"]

		let num:Int = array.count

4、数组位置的 获取

	// Array 型字符串

		let array = ["bei", "jing", "huan", "ying", "ni"]

		// 获取起始位置,即 0
let startIndex = array.startIndex // 获取结束位置,指 数组最后一个元素的位置
let endIndex = array.endIndex // 获取指定位置下标值
let index = array.startIndex.advancedBy(2) // 获取下标区间值
let range = array.startIndex.advancedBy(4)...array.startIndex.advancedBy(6) // 获取指定位置下标的 前一个值
let predecessorIndex = array.startIndex.advancedBy(2).predecessor() // 获取指定位置下标的 后一个值
let successorIndex = array.startIndex.advancedBy(2).successor()

5、数组元素的 获取

	// Array 型数组

		let array:Array = ["bei", "jing", "huan", "ying", "ni"]

		// 获取数组指定下标的元素
let obj1:String = array[1] // 获取数组的第一个元素
let obj2:String? = array.first // 获取数组的最后一个元素
let obj3:String? = array.last // 获取数组指定范围内的元素
let obj4 = array[2...4] // NSArray 型数组 let nsArray:NSArray = ["bei", "jing", "huan", "ying", "ni"] // 获取指定下标元素,NSArray 中数据类型为 AnyObject
let obj5:String = nsArray[2] as! String // 获取数组指定下标的元素
let obj6:String = nsArray.objectAtIndex(2) as! String // 获取数组的第一个元素
let obj7:String = nsArray.firstObject as! String // 获取数组的最后一个元素
let obj8:String = nsArray.lastObject as! String // 获取数组指定范围内的元素
let obj9 = nsArray.objectsAtIndexes(NSIndexSet(indexesInRange: NSMakeRange(2, 2))) // 获取数组指定范围内的元素
let obj10 = nsArray.subarrayWithRange(NSMakeRange(2, 3))

6、数组下标的 获取

	// Array 型数组

		let array:Array = ["bei", "jing", "huan", "ying", "ni"]

		// 获取指定元素的下标,若元素不存在,返回 nil
let indexNum1:Int? = array.indexOf("huan") // NSArray 型数组 let nsArray:NSArray = ["bei", "jing", "huan", "ying", "ni"] // 获取指定元素的下标,若元素不存在,返回 Int.max
let indexNum2:Int = nsArray.indexOfObject("hun")

7、数组的 判断

	// Array 型数组

		let arr1:Array = [1, 3, 5, 8]
let arr2:Array = [1, 3, 7, 8] // 判断两个数组是否相等
let bl1:Bool = arr1 == arr2 // 判断数组是否为空
let bl2:Bool = arr1.isEmpty // 判断数组中是否存在指定的元素
let bl3:Bool = arr1.contains(55) // NSArray 型数组 let nsArr1:NSArray = [2, 3, 5, 8]
let nsArr2:NSArray = [1, 4, 7, 9] // 判断两个数组是否相等
let bl4:Bool = nsArr1.isEqualToArray(nsArr2 as [AnyObject]) // 判断数组中是否存在指定的元素
let bl5:Bool = nsArr1.containsObject(7) // 返回两个数组中第一个相同的元素,没有时返回 nil
let firstObj:AnyObject? = nsArr1.firstObjectCommonWithArray(nsArr2 as [AnyObject])

8、数组元素的组合

	// NSArray 型数组

		let arr1:NSArray = ["bei", "jing", "huan", "ying", "nin"]
let arr2:NSArray = ["Users", "JHQ0228", "Desktop"] // 按指定字符组合
let str1:String = arr1.componentsJoinedByString(" ") // 按路径组合
let str2:String = NSString.pathWithComponents(arr2 as! [String])

9、数组元素的 追加

	// Array 型数组

		var arr1:Array = ["bei", "jing"]

		// 使用 "+" 号连接两个数组
let arr2 = arr1 + ["huan", "ying", "ni"] // 在数组末尾追加一个元素
arr1.append("hao") // 在指定位置插入一个元素
arr1.insert("ni", atIndex: 2) // NSArray 型数组 let nsArray:NSMutableArray = ["jing", "huan"] // 向数组添加一个元素,返回一个新的数组
let nsArray1 = nsArray.arrayByAddingObject("ma") // 在数组末尾追加一个元素
nsArray.addObject("ni") // 在数组末尾追加一个数组
nsArray.addObjectsFromArray(["ni", "hao"]) // 在指定位置追加一个元素
nsArray.insertObject("bei", atIndex: 0)

10、数组元素的 删除

	// Array 型数组

		var arr1:Array = ["bei", "jing", "huan", "ying", "ni"]

		// 删除指定位置的数组元素
arr1.removeAtIndex(3) // 删除数组中的最后一个元素
arr1.removeLast() // 删除指定范围内的数组元素
arr1.removeRange(0...1) // 删除所有数组元素
arr1.removeAll(keepCapacity: true) // NSArray 型数组 let nsArr1:NSMutableArray = ["nan", "jing", "huan", "ying", "nin", "bei", "jing", "ni", "hao"] // 删除指定下标的元素
nsArr1.removeObjectAtIndex(2) // 删除指定元素,删除所有指定元素
nsArr1.removeObject("ying") // 删除指定元素
nsArr1.removeObjectIdenticalTo("nan") // 删除最后一个元素
nsArr1.removeLastObject() // 删除指定范围的元素
nsArr1.removeObjectsInRange(NSMakeRange(2, 1)) // 删除所有元素
nsArr1.removeAllObjects()

11、数组元素的 替换

	// NSArray 型数组

		let nsArr:NSMutableArray = ["nan", "jing", "huan", "ying", "nin"]

		// 替换指定下标元素
nsArr.replaceObjectAtIndex(0, withObject: "bei") // 替换的元素个数与被替换的元素个数需相等
nsArr.replaceObjectsAtIndexes(NSIndexSet(indexesInRange: NSMakeRange(2, 3)),
withObjects: ["ni", "hao", "ma"]) // 用数组替换
nsArr.replaceObjectsInRange(NSMakeRange(2, 3), withObjectsFromArray: ["huan", "ying"]) nsArr.replaceObjectsInRange(NSMakeRange(0, 2),
withObjectsFromArray: ["huan", "ying", "nin", "nan", "jing", "huan"],
range: NSMakeRange(3, 2))

12、数组元素的 交换

	// NSArray 型数组
let nsArr:NSMutableArray = ["bei", "jing", "huan", "ying", "nin"] nsArr.exchangeObjectAtIndex(2, withObjectAtIndex: 4)

13、数组元素的 修改

	// Array 型数组

		var arr:Array = ["bei", "jing", "huan", "ying", "ni"]

		arr[0] = "nan"

		// NSArray 型数组
let nsArr:NSMutableArray = ["bei", "jing", "huan", "ying", "nin"] // 修改数组中的某个元素
nsArr[4] = "ni" // 修改整个数组(覆盖重写)
nsArr.setArray(["ni", "hao"])

14、数组元素的 过滤

	// Array 型数组

		let arr:Array = [1, 9, 2, 8, 45]

		let array:[Int] = arr.filter { (obj:Int) -> Bool in

			// 过滤掉不能被 3 整除的数
return obj % 3 == 0
} // NSArray 型数组 let nsArr:NSMutableArray = [1, 9, 2, 8, 45] let nsArray:[AnyObject] = nsArr.filter { (obj:AnyObject) -> Bool in // 过滤掉不能被 3 整除的数
return (obj as! Int) % 3 == 0
}

15、数组的遍历

  • 用 for...in 循环遍历

    	// Array 或 NSArray 型数组
    
    		let arr = ["bei", "jing", "huan", "ying", "ni"]
    
    		// tmp 无需定义,在 Swift 2.2 中 C 语言样式的 for 循环语句被废弃
    for tmp in arr { print(tmp)
    }
  • 用闭包循环遍历

    	// NSArray 型数组
    
    		let arr:NSArray = ["bei", "jing", "huan", "ying", "ni"]
    
    		arr.enumerateObjectsUsingBlock { (obj:AnyObject, idx:Int, stop:UnsafeMutablePointer<ObjCBool>) in
    
    			print(obj)
    
    			if obj.isEqualTo("huan") {
    
    				// 停止继续遍历
    stop.initialize(true)
    }
    }
  • 用迭代器遍历

    	// NSArray 型数组
    
    		let arr:NSArray = ["bei", "jing", "huan", "ying", "ni"]
    
    		// 正序遍历
    let enu1:NSEnumerator = arr.objectEnumerator() // 反序遍历
    let enu2:NSEnumerator = arr.reverseObjectEnumerator() // AnyObject 后不要加 ?,否则会导致一直循环
    while let obj:AnyObject = enu1.nextObject() { print(obj)
    }
  • 条件遍历

    	// NSArray 型数组
    
    		let arr:NSArray = ["bei", "jing", "huan", "ying", "huan", "ni"]
    
    		// 1. indexesOfObjectsPassingTest 找出数组中所有满足条件的值
    
    			let indexSet:NSIndexSet = arr.indexesOfObjectsPassingTest { (obj:AnyObject,
    idx:Int,
    stop:UnsafeMutablePointer<ObjCBool>) -> Bool in // 条件满足时返回满足的数组元素的下标
    return obj.isEqualTo("huan") ? true : false
    } indexSet.enumerateIndexesUsingBlock { (idx:Int, stop:UnsafeMutablePointer<ObjCBool>) in print(idx)
    } // 2. indexOfObjectPassingTest 找出数组中第一个满足条件的值 let index:Int = arr.indexOfObjectPassingTest { (obj:AnyObject,
    idx:Int,
    stop:UnsafeMutablePointer<ObjCBool>) -> Bool in // 条件满足时返回满足的数组元素的下标
    return obj.isEqualTo("huan") ? true : false
    } print(index)

16、数组的排序

  • 冒泡排序

    	// NSArray 型数组
    
    		let array:NSMutableArray = ["bei", "jing", "huan", "ying", "ni"]
    
    		for i in 0 ..< array.count - 1 {
    for j in 0 ..< array.count - 1 - i { // 大小判断 升序
    if (array[j] as! String).compare(array[j + 1] as! String) == NSComparisonResult.OrderedAscending { // 位置交换
    array.exchangeObjectAtIndex(j, withObjectAtIndex: j + 1)
    }
    }
    }
    print(array)
  • 用闭包排序

    	// Array 型数组
    
    		// 1. 利用闭包进行排序,可变数组排序
    
    			var varArray:Array = ["sunday", "sunny", "summer", "sun"];
    
    			varArray.sortInPlace { (obj1:String, obj2:String) -> Bool in
    
    				return obj1 < obj2
    } print(varArray) // 2. 利用闭包进行排序,不可变数组排序 let letArray:Array = ["sunday", "sunny", "summer", "sun"]; let array = letArray.sort { (obj1:String, obj2:String) -> Bool in return obj1 < obj2
    } print(array) // NSArray 型数组 // 1. 利用闭包进行排序,可变数组排序 let nsMArray1:NSMutableArray = ["sunday", "sunny", "summer", "sun"]; nsMArray1.sortUsingComparator { (obj1:AnyObject, obj2:AnyObject) -> NSComparisonResult in let result:NSComparisonResult = (obj1 as! String).compare(obj2 as! String) return result
    } print(nsMArray1) // 2. 利用闭包进行排序,不可变数组排序 let nsArray1:NSArray = ["sunday", "sunny", "summer", "sun"]; let array1:NSArray = nsArray1.sortedArrayUsingComparator { (obj1:AnyObject,
    obj2:AnyObject) -> NSComparisonResult in let result:NSComparisonResult = (obj1 as! String).compare(obj2 as! String) return result
    } print(array1)
  • 用指定的方法排序

    	// Array 型数组
    
    		// 1. 用指定的方法排序,可变数组排序
    
    			var varArray:Array = ["sunday", "sunny", "summer", "sun"];
    
    			// 直接使用 Swift 数组类型中定义的小于号 (<) 实现,public func <(lhs: String, rhs: String) -> Bool
    varArray.sortInPlace( < ) print(varArray) // 2. 用指定的方法排序,不可变数组排序 let letArray:Array = ["sunday", "sunny", "summer", "sun"]; // 直接使用 Swift 数组类型中定义的小于号 (<) 实现,public func <(lhs: String, rhs: String) -> Bool
    let array = letArray.sort( < ) print(array) // NSArray 型数组 // 1. 用指定的方法排序,可变数组排序 let nsMArray1:NSMutableArray = ["sunday", "sunny", "summer", "sun"]; // 原数组的顺序改变,指定元素的比较方法:compare:,默认为升序排列,
    // #selector(NSNumber.compare(_:)) 代替 Selector("compare:")
    nsMArray1.sortUsingSelector(#selector(NSNumber.compare(_:))) print(nsMArray1) // 使排序结果 降序 排列
    let enu:NSEnumerator = nsMArray1.reverseObjectEnumerator() while let obj:AnyObject = enu.nextObject() {
    print(obj)
    } // 2. 用指定的方法排序,不可变数组排序 let nsArray1:NSArray = ["sunday", "sunny", "summer", "sun"]; // 返回一个排好的数组,原数组的顺序不变,指定元素的比较方法:compare:
    let array1:NSArray = nsArray1.sortedArrayUsingSelector(#selector(NSNumber.compare(_:))) print(array1) // 3. 用指定的方法排序,自定义类 // Student.swift class Student: NSObject { var firstName:String
    var lastName:String init(firstName:String, lastName:String ) { self.firstName = firstName
    self.lastName = lastName
    } func compareStudent(stu:Student) -> NSComparisonResult { // 先按照姓排序
    var result:NSComparisonResult = self.lastName.compare(stu.lastName) if result == NSComparisonResult.OrderedSame { // 如果有相同的姓,就比较名字
    result = self.firstName.compare(stu.firstName)
    }
    return result;
    } // 需遵守协议 Printable
    override var description: String{ return String(format: "%@, %@", self.lastName, self.firstName)
    }
    } // main.swift let stu1:Student = Student(firstName: "MingJie", lastName: "Li")
    let stu2:Student = Student(firstName: "LongHu", lastName: "Huang")
    let stu3:Student = Student(firstName: "LianJie", lastName: "Li")
    let stu4:Student = Student(firstName: "Jian", lastName: "Xiao") // 用指定的方法排序,可变数组排序 let nsMArray2:NSMutableArray = NSMutableArray(objects: stu1, stu2, stu3, stu4) // 代替 Selector("compareStudent:")
    nsMArray2.sortUsingSelector(#selector(Student.compareStudent(_:))) print(nsMArray2) // 用指定的方法排序,不可变数组排序 let nsArray2:NSArray = NSArray(objects: stu1, stu2, stu3, stu4) let array2:NSArray = nsArray2.sortedArrayUsingSelector(#selector(Student.compareStudent(_:))) print(array2)
  • 按描述器排序

    	// Student.swift
    
    		class Student: NSObject, Printable {
    
    			var firstName:String
    var lastName:String init(firstName:String, lastName:String ) { self.firstName = firstName
    self.lastName = lastName
    } override var description: String{ return String(format: "%@, %@", self.lastName, self.firstName)
    }
    } // main.swift let stu1:Student = Student(firstName: "MingJie", lastName: "Li")
    let stu2:Student = Student(firstName: "LongHu", lastName: "Huang")
    let stu3:Student = Student(firstName: "LianJie", lastName: "Li")
    let stu4:Student = Student(firstName: "Jian", lastName: "Xiao") // 先按照姓进行排序
    let lastnNmeDesc:NSSortDescriptor = NSSortDescriptor(key: "lastName", ascending: true) // 再按照名进行排序
    let firstNameDesc:NSSortDescriptor = NSSortDescriptor(key: "firstName", ascending: true) // 1.按描述器排序,可变数组排序 let array1 = NSMutableArray(objects: stu1, stu2, stu3, stu4) // 按顺序添加排序描
    let descs1 = NSArray(objects: lastnNmeDesc, firstNameDesc) array1.sortUsingDescriptors(descs1 as! [NSSortDescriptor]) print(array1) // 2.按描述器排序,不可变数组排序 let array2 = NSArray(objects: stu1, stu2, stu3, stu4) // 按顺序添加排序描
    let descs2 = NSArray(objects: lastnNmeDesc, firstNameDesc) let array3 = array2.sortedArrayUsingDescriptors(descs2 as! [NSSortDescriptor]) print(array3)

iOS - Swift Array 数组的更多相关文章

  1. swift Array 数组

    // //  main.Swift //  swift数组 // //  Created by zhangbiao on 14-6-15. //  Copyright (c) 2014年 理想. Al ...

  2. [Swift]Array数组的swapAt函数

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  3. iOS -Swift 3.0 -Array(数组与可变数组相关属性及用法)

    // // ViewController.swift // Swift-Array // // Created by luorende on 16/9/12. // Copyright © 2016年 ...

  4. Swift中实现Array数组和NSArray数组的相互转换与遍历

    Array是Swift中的数组数据类型.而NSArray是OC中的数组数据类型.两者有差别有联系.在Swift中有时候难免会使用到OC中的一些东西.今天我们就来Swift中使用NSArray和Arra ...

  5. 窥探Swift之数组与字典

    说到数组和字典,只要是编过程的小伙伴并不陌生.在Swift中的数组与字典也有着一些让人眼前一亮的特性,今天的博客就来窥探一下Swift中的Array和Dictionary.还是沿袭之前的风格,在介绍S ...

  6. ios Swift 国外资源

    Swift国外资源汇总(No.1) 此类分享贴暂定每2天更新一次,主要目的是让大家能跟国外开发者们同步,共享知识和共同提高. 对于一些非常有价值的文章,大家有兴趣可以自行翻译(回贴跟我说一声,避免重复 ...

  7. Swift 之数组与字典

    http://www.cocoachina.com/swift/20151230/14802.html 说到数组和字典,只要是编过程的小伙伴并不陌生.在Swift中的数组与字典也有着一些让人眼前一亮的 ...

  8. Swift3 - String 字符串、Array 数组、Dictionary 字典的使用

    Swift相关知识,本随笔为 字符串.数组.字典的简单使用,有理解.使用错误的地方望能指正. ///************************************************** ...

  9. 窥探Swift之数组安全索引与数组切片

    今天是元宵节,祝大家元宵节快乐!在Swift中的数组和字典中下标是非常常见的,数组可以通过索引下标进行元素的查询,字典可以通过键下标来获取相应的值.在使用数组时,一个常见的致命错误就是数组越界.如果在 ...

随机推荐

  1. Hadoop集群管理之内存管理

    1.内存 Hadoop为各个守护进程(namenode,secondarynamenode,jobtracker,datanode,tasktracker)统一分配的内存在hadoop-env.sh中 ...

  2. 项目管理:CocoaPods建立私有仓库

    CocoaPods是iOS,Mac下优秀的第三方包管理工具,类似于java的maven,给我们项目管理带来了极大的方便. 个人或公司在开发过程中,会积累很多可以复用的代码包,有些我们不想开源,又想像开 ...

  3. JavaScript DOM 编程艺术(第2版)读书笔记(5)

    最佳实践 平稳退化 网站的访问者完全有可能使用的是不支持Javascript的浏览器,还有一种可能是虽然浏览器支持Javascript,但用户已经禁用它了.如果没有考虑到这种情况,人们在访问你们的网站 ...

  4. 使用Window Live Writer写博客

    1.打开“日志账户”—>“日志选项”. 2.点击“更新账户信息”. 3.输入博客地址,用户名和密码,点击“下一步”. 4.耐心等待片刻... 5.设置“日志昵称”,点击“完成”. 这样就大功告成 ...

  5. office 2013 产品秘钥

    9RN4T-JPBQV-XQMC9-PM9FP-PGWP9 TKX7J-VDN26-Y2WKQ-7MG8R-X2CC9 N9M8X-QDKGK-W27Q6-2GQYT-TJC9K 4VNXV-F7PB ...

  6. Apache Commons-pool实现对象池(包括带key对象池)

    Commons-pool是一个apache开源组织下的众多项目的一个.其被广泛地整合到众多需要对象池功能的项目中. 官网:http://commons.apache.org/proper/common ...

  7. EasyUI DataGrid 添加排序

    这个事例演示了如何在点击列头的时候排序DataGrid中全部的列可以通过点击列头被排序.你可以定义可以被排序的列.默认的,列不能被排序除非你设置sortable属性为TRUE,下面是例子:标记 < ...

  8. 华为S5700S配置总结

    需要使用通讯控制线缆连接电脑和交换机, 一头接交换机的Console口,一头接电脑(应该需要串口,没有的话得用USB转串口). 在PC机上运行终端仿真程序,设置终端通信参数为: 波特率为9600bit ...

  9. static变量在php和java中的生命周期

    1. java的static变量伴随着java虚拟机的退出而消亡,java虚拟机运行期间,static变量一直存在 2. php的static变量只针对一次请求(一次php文件的执行),php文件执行 ...

  10. 在Quartus II中分配管脚的两种常用方法

    在Quartus II中分配管脚的两种常用方法 示范程序 seg7_test.v 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 /* * ...