iOS - Swift Set 集合

简介: 前言Set:集合 public struct Set : Hashable, CollectionType, ArrayLiteralConvertible public class NSSet : NSObject, NSCopying, NSMutableCopying, NSSecureCoding, NSFastEnumeration集 NSSet 是一个无序对象的集合。

前言

  • 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)
目录
相关文章
|
1天前
|
存储 JavaScript 前端开发
JavaScript进阶-Map与Set集合
【6月更文挑战第20天】JavaScript的ES6引入了`Map`和`Set`,它们是高效处理集合数据的工具。`Map`允许任何类型的键,提供唯一键值对;`Set`存储唯一值。使用`Map`时,注意键可以非字符串,用`has`检查键存在。`Set`常用于数组去重,如`[...new Set(array)]`。了解它们的高级应用,如结构转换和高效查询,能提升代码质量。别忘了`WeakMap`用于弱引用键,防止内存泄漏。实践使用以加深理解。
|
10天前
|
存储 安全 Java
Java集合详解:Set, Map, Vector, List的对比与联系
Java集合框架核心包括List、Set、Map和Vector。List允许重复元素,如ArrayList(适合读取)和LinkedList(适合插入删除)。Set不允许重复,有HashSet(无序)和TreeSet(排序)。Map存储键值对,HashMap(无序)和TreeMap(排序)。Vector是线程安全的ArrayList替代品,但在多线程环境下使用。选择集合类型应根据应用场景,如有序、无序、键值对需求及线程安全考虑。
|
13天前
|
存储 安全 Java
Java 集合(List、Set、Map 等)相关问答归纳再整理
HashMap 中使用键对象来计算 hashcode 值 HashSet 使用成员对象来计算 hashcode 值,对于两个对象来说hashcode 可能相同,所以 equals() 方法用来判断对象的相等性,如果两个对象不同的话,那么返回 false。 HashMap 比较快,因为是使用唯一的键来获取对象,HashSet 较 HashMap 来说比较慢。 4.1.3 HashMap 与 TreeMap
9 2
|
14天前
|
存储 Java 索引
JavaSE——集合框架一(6/7)-Set系列集合:LinkedHashSet的底层原理、TreeSet集合(介绍,自定义排序规则,排序示例)
JavaSE——集合框架一(6/7)-Set系列集合:LinkedHashSet的底层原理、TreeSet集合(介绍,自定义排序规则,排序示例)
18 1
|
14天前
|
存储 Java 索引
JavaSE——集合框架一(5/7)-Set系列集合:Set集合的特点、底层原理、哈希表、去重复原理
JavaSE——集合框架一(5/7)-Set系列集合:Set集合的特点、底层原理、哈希表、去重复原理
29 1
|
28天前
|
设计模式 前端开发 Swift
使用Swift进行iOS应用开发:深入探索与最佳实践
【5月更文挑战第24天】探索Swift在iOS开发中的深度应用与最佳实践。Swift以其简洁语法、类型安全、面向对象、高性能及与Objective-C的互操作性脱颖而出。使用Xcode设置开发环境,学习Swift语法,创建并设计项目,编写业务逻辑,同时进行调试和测试。遵循MVC模式,利用SwiftUI、并发特性,并注重内存管理,持续学习新工具和技术,以实现高质量应用开发。
|
16天前
|
存储 NoSQL Redis
Redis第七弹-Set与ZSET基本操作,Set(集合特点)SADD key member(注意这个key,必须是你自定义名字,不能用key)​编辑SMEMBERS key-查询所有的key
Redis第七弹-Set与ZSET基本操作,Set(集合特点)SADD key member(注意这个key,必须是你自定义名字,不能用key)​编辑SMEMBERS key-查询所有的key
|
24天前
|
存储 Java Serverless
Java集合利器 Map & Set
Java集合利器 Map & Set
|
29天前
|
机器学习/深度学习 存储 NoSQL
Redis -- set集合
Redis -- set集合
26 0
|
1月前
|
安全 Swift iOS开发
【Swift 开发专栏】Swift 与 UIKit:构建 iOS 应用界面
【4月更文挑战第30天】本文探讨了Swift和UIKit在构建iOS应用界面的关键技术和实践方法。Swift的简洁语法、类型安全和高效编程模型,加上与UIKit的紧密集成,使开发者能便捷地创建用户界面。UIKit提供视图、控制器、布局、动画和事件处理等功能,支持灵活的界面设计。实践中,遵循设计原则,合理组织视图层次,运用布局和动画,以及实现响应式设计,能提升界面质量和用户体验。文章通过登录、列表和详情界面的实际案例展示了Swift与UIKit的结合应用。

相关课程

更多