iOS - Swift Set 集合

时间:2023-01-12 17:18:23

前言

  • Set:集合

    	public struct Set<Element : Hashable> : Hashable, CollectionType, ArrayLiteralConvertible
    public class NSSet : NSObject, NSCopying, NSMutableCopying, NSSecureCoding, NSFastEnumeration
    • 集 NSSet 是一个无序对象的集合。集也有动态和静态之分,NSSet 是静态类型,成员不能被修改。NSMutableSet 是动态类型,成员可以被修改。

    • 集和数组不一样的是,它存储的每一个元素都是唯一的,没有完全相同的两个元素。所以数组中如果有两个相同的值,转换为集后只会有一个值。

  • NSCountedSet:计数集合

    	public class NSCountedSet : NSMutableSet
    • NSCountedSet 这种集合中同一对象可以出现多次,然而并非在集合中存放多次这个对象,而是维护一个次数计数。当第一次将对象添加到集合中时,对象的 count 值被置为 1,然后每次将这个对象添加到集合中,count 值就会增加 1,每次从集合中删除对象,count 值就会减 1.当对象的 count 值为零时,实际上对象本身就被删除了。
  • NSIndexSet:索引集合

    	public class NSIndexSet : NSObject, NSCopying, NSMutableCopying, NSSecureCoding
    public class NSMutableIndexSet : NSIndexSet
    • NSIndexSet 这种集合用于存储有序的索引到某种数据结构,比如数组。

1、集合的 创建

	// Set 型集合

		// 不赋初值,指定数据类型为 String 型
let set1 = Set<String>() // 不指定数据类型,自动推断
let set2:Set = [1, 3, 5, 7] // 指定数据类型为 Int 型
let set3:Set<Int> = [1, 3, 5, 7] // NSSet 型集合 let swiftArr:Array = ["a", "b", "c"]
let swiftSet:Set = [1, 2, 3, 4] // 创建一个空集合
let nsSet1:NSSet = NSSet() // 指定多个元素值
let nsSet2:NSSet = [2, 4, 6, 8] // 由 Array 型数组创建
let nsSet3:NSSet = NSSet(array:swiftArr) // 由 Set 型集合创建
let nsSet4:NSSet = NSSet(set: swiftSet) // 由 NSSet 型集合创建
let nsSet5:NSSet = NSSet(set: nsSet3) // 指定一个元素值
let nsSet6:NSSet = NSSet(object: 7) // 指定多个元素值
let nsSet7:NSSet = NSSet(objects: 2, 4, 6, 8)

2、集合成员 个数的计算

	// Set 或 NSSet 型集合

		let set:NSSet = [1, 3, 5, 7]

		let num:Int = set.count

3、集合元素的获取

	// NSSet 型集合

		let nsSet:NSSet = [2, 4, 6, 8]

		// 获取集合中指定的元素,不存在时返回 nil
let object1:AnyObject? = nsSet.member(8) // 获取集合中随机的一个值,集合为空时返回 nil
let objects1:AnyObject? = nsSet.anyObject() // 获取集合中所有的元素
let objects2:AnyObject = nsSet.allObjects

4、集合的比较

	// Set 型集合

		let swiftSet1:Set = [1, 3, 5, 7]
let swiftSet2:Set = [5, 7, 9, 11] // 判断集合是否为空
let bl1:Bool = swiftSet1.isEmpty // 判断集合中是否包含某个元素
let bl2:Bool = swiftSet1.contains(7) // 相等,判断两个集合是否相等
let bl3:Bool = swiftSet1 == swiftSet2 // 子集,判断当前集合是否是指定集合的子集
let bl4:Bool = swiftSet1.isSubsetOf(swiftSet2) // 交集,返回当前集合与指定集合的交集,没有交集时返回一个空集合
let interSet:Set = swiftSet1.intersect(swiftSet2) // 并集,返回当前集合与指定集合的并集
let unionSet:Set = swiftSet1.union(swiftSet2) // NSSet 型集合 let nsSet1:NSSet = [2, 4, 6, 8]
let nsSet2:NSSet = [6, 8, 10, 12]
let nsSet3:NSMutableSet = [6, 8, 10, 12] // 判断集合中是否包含某个元素
let bl5:Bool = nsSet1.containsObject(8) // 相等,判断两个集合是否相等
let bl6:Bool = nsSet1 == nsSet2 // 相等,判断两个集合是否相等
let bl7:Bool = nsSet1.isEqualToSet(nsSet2 as Set) // 子集,判断当前集合是否是指定集合的子集
let bl8:Bool = nsSet1.isSubsetOfSet(nsSet2 as Set) // 交集,判断当前集合与指定集合是否有交集
let bl9:Bool = nsSet1.intersectsSet(nsSet2 as Set) // 交集,返回当前集合与指定集合的交集,返回到当前集合中
nsSet3.intersectSet(nsSet1 as Set) // 并集,返回当前集合与指定集合的并集,返回到当前集合中
nsSet3.unionSet(nsSet1 as Set) // 补集,返回当前集合与指定集合的补集,返回到当前集合中,当前集合中删除与指定集合的交集
nsSet3.minusSet(nsSet1 as Set)

5、集合元素的添加

	// Set 型集合

		var swiftSet:Set = [1, 3, 5, 7]

		// 向集合中添加一个元素
swiftSet.insert(8) // NSSet 型集合 let nsSet:NSMutableSet = [2, 4, 6, 8] // 向集合中添加一个元素
nsSet.addObject(10) // 向集合中添加一个数组
nsSet.addObjectsFromArray([11, 12, 12])

6、集合元素的删除

	// Set 型集合

		var swiftSet:Set = [1, 3, 5, 7]

		// 删除第一个元素
swiftSet.removeFirst() // 删除指定元素
swiftSet.remove(1) // 删除所有元素
swiftSet.removeAll(keepCapacity: true) // NSSet 型集合 let nsSet:NSMutableSet = [2, 4, 6, 8] // 删除指定元素
nsSet.removeObject(4) // 删除指定集合,当前集合中删除与指定集合的交集
nsSet.minusSet([2, 6]) // 删除所有元素
nsSet.removeAllObjects()

7、集合元素的修改

	// NSSet 型集合

		let nsSet:NSMutableSet = [2, 4, 6, 8]

		nsSet.setSet([1, 2, 3])

8、集合的遍历

	// NSSet 型集合

		let nsSet:NSSet = [2, 4, 6, 8]

		// 用闭包遍历

			nsSet.enumerateObjectsUsingBlock { (obj:AnyObject, stop:UnsafeMutablePointer<ObjCBool>) in

				print(obj)
} // 用迭代遍历 let enu:NSEnumerator = nsSet.objectEnumerator() // AnyObject 后不要加 ?,否则会导致一直循环
while let obj:AnyObject = enu.nextObject() { print(obj)
} // 条件遍历 let set:Set = nsSet.objectsPassingTest { (obj:AnyObject, stop:UnsafeMutablePointer<ObjCBool>) -> Bool in return (obj as! Int) > 5 ? true : false
} print(set)

9、计数集合的创建

	let nsCountSet1:NSCountedSet = NSCountedSet()
let nsCountSet2:NSCountedSet = NSCountedSet(capacity: 0) let nsCountSet3:NSCountedSet = NSCountedSet(array: [1, 3, 5, 7, 9]) let nsCountSet4:NSCountedSet = NSCountedSet(set: [6, 9]) let nsCountSet5:NSCountedSet = NSCountedSet(object: 8)
let nsCountSet6:NSCountedSet = NSCountedSet(objects: [2, 3, 6, 8], count: 4)

10、计数集合元素的添加

	let nsCountSet:NSCountedSet = [1, 3, 5, 7, 9]

	// 向集合中多次添加同一个元素,该元素的计数值增加
nsCountSet.addObject(6)

11、计数集合元素的删除

	let nsCountSet:NSCountedSet = [1, 3, 5, 7, 9]

	// 从集合中删除元素,该元素的计数值减小
nsCountSet.removeObject(5)

12、计数集合计数值的计算

	let nsCountedSet:NSCountedSet = NSCountedSet(array: [1, 2, 3])

	nsCountedSet.addObject(2)
nsCountedSet.removeObject(1) // 检索集合中指定元素的计数值
let num1:Int = nsCountedSet.countForObject(1) // 检索集合中指定元素的计数值
let num2:Int = nsCountedSet.countForObject(2)

13、索引集合的创建

	let indexSet1:NSIndexSet = NSIndexSet()

	let indexSet2:NSIndexSet = NSIndexSet(index: 8)

	let indexSet3:NSIndexSet = NSIndexSet(indexSet: indexSet2)

	let indexSet4:NSIndexSet = NSIndexSet(indexesInRange: NSMakeRange(1, 8))

14、索引集合元素数量的计算

	let indexSet:NSIndexSet = NSIndexSet(indexesInRange: NSMakeRange(1, 8))

	// 计算索引集合所有索引的数量
let num1:Int = indexSet.count // 计算索引集合中某一范围内的索引的数量
let num2:Int = indexSet.countOfIndexesInRange(NSMakeRange(3, 4))

15、索引集合元素的获取

	let indexSet:NSIndexSet = NSIndexSet(indexesInRange: NSMakeRange(1, 8))

	// 获取索引集合中的第一个索引,如果集合为空则返回 NSNotFound
let index1:Int = indexSet.firstIndex // 获取索引集合的最后一个索引,如果集合为空则返回 NSNotFound
let index2:Int = indexSet.lastIndex // 获取索引集合中小于指定的索引且最接近的索引,如果没有小于的索引则返回 NSNotFound
let index3:Int = indexSet.indexLessThanIndex(5) // 获取索引集合中小于等于指定的索引且最接近的索引,如果没有小于的索引则返回 NSNotFound
let index4:Int = indexSet.indexLessThanOrEqualToIndex(5) // 获取索引集合中大于指定的索引且最接近的索引,如果没有大于的索引则返回 NSNotFound
let index5:Int = indexSet.indexGreaterThanIndex(7) // 获取索引集合中大于等于指定的索引且最接近的索引,如果没有大于的索引则返回 NSNotFound
let index6:Int = indexSet.indexGreaterThanOrEqualToIndex(7)

16、索引集合的判断

	let indexSet:NSIndexSet = NSIndexSet(indexesInRange: NSMakeRange(1, 8))

	// 判断索引集合中是否包含某个索引
let bl1:Bool = indexSet.containsIndex(9) // 判断一个索引集合中是否包含另一个索引集合
let bl2:Bool = indexSet.containsIndexes(NSIndexSet(indexesInRange: NSMakeRange(2, 3))) // 判断一个索引集合中是否包含某一个范围内的所有值
let bl3:Bool = indexSet.containsIndexesInRange(NSMakeRange(2, 3)) // 判断一个索引集合中是否包含某一个范围内的值(是否有交集)
let bl4:Bool = indexSet.intersectsIndexesInRange(NSMakeRange(7, 3)) // 判断两个索引集合是否相等
let bl5:Bool = indexSet.isEqualToIndexSet(NSIndexSet(indexesInRange: NSMakeRange(1, 7)))

17、索引集合的添加

	let mIndexSet:NSMutableIndexSet = NSMutableIndexSet(indexesInRange: NSMakeRange(1, 3))

	// 添加一个索引元素,集合中已存在时会合并
mIndexSet.addIndex(6) // 添加一个索引集合,两个索引集合有交集时会合并
mIndexSet.addIndexes(NSIndexSet(indexesInRange: NSMakeRange(8, 2))) // 添加一个范围内的元素,有交集时会合并
mIndexSet.addIndexesInRange(NSMakeRange(12, 3))

18、可变索引集合删除

	let mIndexSet:NSMutableIndexSet = NSMutableIndexSet(indexesInRange: NSMakeRange(1, 10))

	// 删除一个索引集合中的索引元素
mIndexSet.removeIndex(2) // 删除指定集合中含有的索引元素
mIndexSet.removeIndexes(NSIndexSet(indexesInRange: NSMakeRange(4, 2))) // 删除指定范围内含有的索引元素
mIndexSet.removeIndexesInRange(NSMakeRange(8, 3)) // 删除全部索引元素
mIndexSet.removeAllIndexes()

19、索引集合的遍历

	let indexSet:NSIndexSet = NSIndexSet(indexesInRange: NSMakeRange(1, 5))

	// 用闭包遍历

		// 1. enumerateIndexesUsingBlock

			// 遍历获取索引集合的所有索引值
indexSet.enumerateIndexesUsingBlock { (idx:Int, stop:UnsafeMutablePointer<ObjCBool>) in print(idx)
} // 2. enumerateRangesUsingBlock // 遍历获取索引集合的起始值和索引元素数量
indexSet.enumerateRangesUsingBlock { (range:NSRange, stop:UnsafeMutablePointer<ObjCBool>) in print("\(range.location), \(range.length)")
} // 条件遍历 // 1. indexesPassingTest // 遍历索引集合,找出索引中所有满足条件的索引
let indexs:NSIndexSet = indexSet.indexesPassingTest { (idx, stop) -> Bool in return idx > 3 ? true : false
} indexs.enumerateIndexesUsingBlock { (idx:Int, stop:UnsafeMutablePointer<ObjCBool>) in print(idx)
} // 2. indexPassingTest // 遍历索引集合,找出索引中第一个满足条件的索引
let index:Int = indexs.indexPassingTest { (idx, stop) -> Bool in return idx > 3 ? true : false
} print(index)

iOS - Swift Set 集合的更多相关文章

  1. iOS Swift WisdomScanKit图片浏览器功能SDK

    iOS Swift WisdomScanKit图片浏览器功能SDK使用 一:简介      WisdomScanKit 由 Swift4.2版编写,完全兼容OC项目调用. WisdomScanKit的 ...

  2. iOS swift的xcworkspace多项目管理(架构思想)

    iOS  swift的xcworkspace多项目管理(架构思想) 技术说明: 今天在这里分享 swift下的 xcworkspace多项目管理(架构思想),能为我们在开发中带来哪些便捷?能为我们对整 ...

  3. iOS Swift 模块练习&sol;swift基础学习

    SWIFT项目练习     SWIFT项目练习2 iOS Swift基础知识代码 推荐:Swift学习使用知识代码软件 0.swift中的宏定义(使用方法代替宏) 一.视图  +控件 1.UIImag ...

  4. ios swift 实现饼状图进度条,swift环形进度条

    ios swift 实现饼状图进度条 // // ProgressControl.swift // L02MyProgressControl // // Created by plter on 7/2 ...

  5. Building gRPC Client iOS Swift Note Taking App

    gRPC is an universal remote procedure call framework developed by Google that has been gaining inter ...

  6. iOS Swift WisdomScanKit二维码扫码SDK,自定义全屏拍照SDK,系统相册图片浏览,编辑SDK

    iOS Swift WisdomScanKit 是一款强大的集二维码扫码,自定义全屏拍照,系统相册图片编辑多选和系统相册图片浏览功能于一身的 Framework SDK [1]前言:    今天给大家 ...

  7. iOS Swift WisdomHUD 提示界面框架

    iOS Swift WisdomHUD 提示界面框架  Framework Use profile(应用简介) 一:WisdomHUD简介 今天给大家介绍一款iOS的界面显示器:WisdomHUD,W ...

  8. iOS Swift WisdomKeyboardKing 键盘智能管家SDK

    iOS Swift WisdomKeyboardKing 键盘智能管家SDK [1]前言:    今天给大家推荐个好用的开源框架:WisdomKeyboardKing,方面iOS日常开发,优点和功能请 ...

  9. iOS swift项目IM实现,从长连接到数据流解析分析之Socket

    iOS  swift项目IM实现,从长连接到底层数据解析分析之Socket 一:项目简介:  去年开始接手了一个国企移动项目,项目的需求是实现IM即时通讯功能. * 一期版本功能包括了:       ...

随机推荐

  1. Kali 使用ssh,安装vmware tools 和字体重叠

    Kali一直是我所爱,说说遇到的问题吧 第一个:字体重叠 gnome-tweak-tool --打开工具 第二个:ssh 修改sshd_config文件,命令为: vi /etc/ssh/sshd_c ...

  2. IOC理解

    控制反转(反转控制):谁控制了谁? 就是交换控制权1.A a =new A();   要使用这个A 必须你去new他.控制权在a2.由第三方来进行创造这个A,你用的时候直接用就是.控制权在第三方. 3 ...

  3. Xcode 快捷键操作

    菜单栏  桌面 dock 不同应用的菜单栏始终出现在桌面最左上部 commond +shift+y 显示那个XCODE的调试框口 commond +R 运行 commond +,是个性设置,对于任何一 ...

  4. &lpar;转&rpar;iOS 开发,工程中混合使用 ARC 和非ARC

    [前提知识] ARC:Automatic Reference Counting,自动引用计数 在开发 iOS 3 以及之前的版本的项目时我们要自己负责使用引用计数来管理内存,比如要手动 retain. ...

  5. CSSBox - Java HTML rendering engine

    CSSBox - Java HTML rendering engine CSSBox is an (X)HTML/CSS rendering engine written in pure Java. ...

  6. 学习了LINUX下用C语言遍历文件夹,一些心得

    struct dirent中的几个成员: d_type:4表示为目录,8表示为文件 d_reclen:16表示子目录或文件,24表示非子目录 d_name:目录或文件的名称 具体代码如下,仅供参考 # ...

  7. 1120 机器人走方格 V3(组合数)

    题目实际上是求catalan数的,Catalan[n] = C(2*n,n) / (n+1) = C(2*n,n) % mod * inv[n+1],inv[n+1]为n+1的逆元,根据费马小定理,可 ...

  8. weblogic使用wlst脚本实现自动部署

    创建weblogic的server和cluster ip="10.20.0.2" nwport=8001 wwport=9001 nwlist=[ ('wtdsrwnw','Clu ...

  9. 在vue中调用echarts中的地图散点图~

    首先!当然是在vue中引入echarts! 命令行  npm install echarts --save 在main.js文件中里引入        import echarts from 'ech ...

  10. Grunt: 拼接代码,js丑化(压缩),css压缩,html压缩,观察文件,拷贝文件,删除文件,压缩文件

    准备工作 grunt 基于nodeJs所以 nodeJs需要的基础配置都需要安装 1.Grunt 安装 npm install -g grunt-cli 这是全局安装 2.在当前文件下npm init ...