前言
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)