iOS - Swift Array 数组
前言
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 数组的更多相关文章
- swift Array 数组
// // main.Swift // swift数组 // // Created by zhangbiao on 14-6-15. // Copyright (c) 2014年 理想. Al ...
- [Swift]Array数组的swapAt函数
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- iOS -Swift 3.0 -Array(数组与可变数组相关属性及用法)
// // ViewController.swift // Swift-Array // // Created by luorende on 16/9/12. // Copyright © 2016年 ...
- Swift中实现Array数组和NSArray数组的相互转换与遍历
Array是Swift中的数组数据类型.而NSArray是OC中的数组数据类型.两者有差别有联系.在Swift中有时候难免会使用到OC中的一些东西.今天我们就来Swift中使用NSArray和Arra ...
- 窥探Swift之数组与字典
说到数组和字典,只要是编过程的小伙伴并不陌生.在Swift中的数组与字典也有着一些让人眼前一亮的特性,今天的博客就来窥探一下Swift中的Array和Dictionary.还是沿袭之前的风格,在介绍S ...
- ios Swift 国外资源
Swift国外资源汇总(No.1) 此类分享贴暂定每2天更新一次,主要目的是让大家能跟国外开发者们同步,共享知识和共同提高. 对于一些非常有价值的文章,大家有兴趣可以自行翻译(回贴跟我说一声,避免重复 ...
- Swift 之数组与字典
http://www.cocoachina.com/swift/20151230/14802.html 说到数组和字典,只要是编过程的小伙伴并不陌生.在Swift中的数组与字典也有着一些让人眼前一亮的 ...
- Swift3 - String 字符串、Array 数组、Dictionary 字典的使用
Swift相关知识,本随笔为 字符串.数组.字典的简单使用,有理解.使用错误的地方望能指正. ///************************************************** ...
- 窥探Swift之数组安全索引与数组切片
今天是元宵节,祝大家元宵节快乐!在Swift中的数组和字典中下标是非常常见的,数组可以通过索引下标进行元素的查询,字典可以通过键下标来获取相应的值.在使用数组时,一个常见的致命错误就是数组越界.如果在 ...
随机推荐
- Hadoop集群管理之内存管理
1.内存 Hadoop为各个守护进程(namenode,secondarynamenode,jobtracker,datanode,tasktracker)统一分配的内存在hadoop-env.sh中 ...
- 项目管理:CocoaPods建立私有仓库
CocoaPods是iOS,Mac下优秀的第三方包管理工具,类似于java的maven,给我们项目管理带来了极大的方便. 个人或公司在开发过程中,会积累很多可以复用的代码包,有些我们不想开源,又想像开 ...
- JavaScript DOM 编程艺术(第2版)读书笔记(5)
最佳实践 平稳退化 网站的访问者完全有可能使用的是不支持Javascript的浏览器,还有一种可能是虽然浏览器支持Javascript,但用户已经禁用它了.如果没有考虑到这种情况,人们在访问你们的网站 ...
- 使用Window Live Writer写博客
1.打开“日志账户”—>“日志选项”. 2.点击“更新账户信息”. 3.输入博客地址,用户名和密码,点击“下一步”. 4.耐心等待片刻... 5.设置“日志昵称”,点击“完成”. 这样就大功告成 ...
- office 2013 产品秘钥
9RN4T-JPBQV-XQMC9-PM9FP-PGWP9 TKX7J-VDN26-Y2WKQ-7MG8R-X2CC9 N9M8X-QDKGK-W27Q6-2GQYT-TJC9K 4VNXV-F7PB ...
- Apache Commons-pool实现对象池(包括带key对象池)
Commons-pool是一个apache开源组织下的众多项目的一个.其被广泛地整合到众多需要对象池功能的项目中. 官网:http://commons.apache.org/proper/common ...
- EasyUI DataGrid 添加排序
这个事例演示了如何在点击列头的时候排序DataGrid中全部的列可以通过点击列头被排序.你可以定义可以被排序的列.默认的,列不能被排序除非你设置sortable属性为TRUE,下面是例子:标记 < ...
- 华为S5700S配置总结
需要使用通讯控制线缆连接电脑和交换机, 一头接交换机的Console口,一头接电脑(应该需要串口,没有的话得用USB转串口). 在PC机上运行终端仿真程序,设置终端通信参数为: 波特率为9600bit ...
- static变量在php和java中的生命周期
1. java的static变量伴随着java虚拟机的退出而消亡,java虚拟机运行期间,static变量一直存在 2. php的static变量只针对一次请求(一次php文件的执行),php文件执行 ...
- 在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 /* * ...