Objective-C语言的集合
Objective-C语言的集合
引言
Objective-C是一种面向对象的编程语言,主要用于苹果的macOS和iOS系统应用程序的开发。作为C语言的一个超集,Objective-C继承了C语言的优雅,同时又添加了许多强大的特性,使其适合于大型项目的开发。在Objective-C中,集合是一种非常重要的数据结构,它可以帮助开发者更高效地管理和操作数据。在本文中,我们将深入探讨Objective-C中的集合,包括数组(NSArray)、字典(NSDictionary)及集合(NSSet)等。
一、Objective-C集合概述
集合是存储一组数据的容器。在Objective-C中,集合主要有三种类型:
- NSArray:有序集合,允许重复元素。
- NSDictionary:无序集合,以键值对的形式存储数据,键是唯一的。
- NSSet:无序集合,不允许重复元素。
1.1 NSArray
NSArray是Objective-C中用于存储有序数据的集合。与C语言的数组相比,NSArray提供了更强大的功能,如动态大小、前向和倒序遍历等。
1.1.1 创建NSArray
创建NSArray可以通过字面量和初始化器两种方式。
```objective-c // 字面量方式 NSArray *array = @[@"苹果", @"香蕉", @"橙子"];
// 初始化器方式 NSArray *array2 = [[NSArray alloc] initWithObjects:@"苹果", @"香蕉", @"橙子", nil]; ```
1.1.2 访问NSArray元素
可以使用索引来访问数组中的元素。需要注意的是,NSArray的索引从0开始。
objective-c NSString *firstFruit = array[0]; // "苹果" NSString *secondFruit = [array objectAtIndex:1]; // "香蕉"
1.1.3 NSArray的方法
NSArray提供了许多方法用于操作数据,如筛选、排序、映射等。
```objective-c // 筛选 NSArray *filteredArray = [array filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"length > 2"]];
// 排序 NSArray *sortedArray = [array sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
// 映射 NSArray *mappedArray = [array valueForKey:@"uppercaseString"]; ```
1.2 NSDictionary
NSDictionary是一种以键值对形式存储数据的集合。每个键必须是唯一的,并且对应一个值。
1.2.1 创建NSDictionary
与NSArray类似,NSDictionary也可以通过字面量和初始化器创建。
```objective-c // 字面量方式 NSDictionary *dict = @{ @"name": @"张三", @"age": @25, @"city": @"北京" };
// 初始化器方式 NSDictionary *dict2 = [[NSDictionary alloc] initWithObjectsAndKeys:@"张三", @"name", @25, @"age", @"北京", @"city", nil]; ```
1.2.2 访问NSDictionary的值
可以通过键来访问对应的值。
objective-c NSString *name = dict[@"name"]; // "张三" NSNumber *age = [dict objectForKey:@"age"]; // 25
1.2.3 NSDictionary的方法
NSDictionary也提供了许多方法用于数据处理,如遍历、查找等。
```objective-c // 遍历 for (NSString *key in dict) { NSLog(@"%@: %@", key, dict[key]); }
// 查找 if ([dict objectForKey:@"name"]) { NSLog(@"找到键为'name'的值: %@", dict[@"name"]); } ```
1.3 NSSet
NSSet是一种无序集合,不允许重复元素。它通常用于需要确保数据唯一性的场景。
1.3.1 创建NSSet
NSSet也可以通过字面量和初始化器创建。
```objective-c // 字面量方式 NSSet *set = [NSSet setWithObjects:@"苹果", @"香蕉", @"橙子", nil];
// 初始化器方式 NSSet *set2 = [[NSSet alloc] initWithObjects:@"苹果", @"香蕉", @"橙子", nil]; ```
1.3.2 访问NSSet元素
由于NSSet是无序的,不能通过索引访问元素,可以遍历集合。
objective-c for (NSString *fruit in set) { NSLog(@"%@", fruit); }
1.3.3 NSSet的方法
NSSet提供的方法相对较少,主要用于集合的操作,如交集、并集和差集等。
```objective-c // 创建另外一个集合 NSSet *set3 = [NSSet setWithObjects:@"香蕉", @"菠萝", nil];
// 交集 NSSet *intersection = [set setByIntersectingSet:set3];
// 并集 NSSet *unionSet = [set setByUnion:set3];
// 差集 NSSet *difference = [set setBySubtractingSet:set3]; ```
二、集合操作示例
为了更好地理解Objective-C集合的使用,下面我们将通过示例展示如何使用这些集合类型来解决实际问题。
2.1 使用NSArray处理数据
假设我们有一组学生的姓名和成绩数据,我们使用NSArray来存储和处理这些数据。
```objective-c NSArray students = @[@"张三", @"李四", @"王五", @"赵六"]; NSArray scores = @[@85, @90, @78, @88];
// 打印学生姓名和成绩 for (NSUInteger i = 0; i < students.count; i++) { NSString student = students[i]; NSNumber score = scores[i]; NSLog(@"学生: %@, 成绩: %@", student, score); }
// 找到分数大于80的学生 NSArray *passingStudents = [students filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF IN %@", scores]]; ```
2.2 使用NSDictionary存储配置信息
在开发应用时,通常会需要存储一些配置信息。这时可以使用NSDictionary。
```objective-c NSDictionary *config = @{ @"API_ENDPOINT": @"https://api.example.com", @"TIMEOUT": @30, @"RETRY_COUNT": @3 };
// 使用配置信息 NSString apiEndpoint = config[@"API_ENDPOINT"]; NSNumber timeout = config[@"TIMEOUT"]; ```
2.3 使用NSSet进行去重
当我们需要处理一组可能包含重复数据的数据时,可以使用NSSet进行去重。
```objective-c NSArray fruits = @[@"苹果", @"香蕉", @"苹果", @"橙子", @"香蕉"]; NSSet uniqueFruits = [NSSet setWithArray:fruits];
// 打印唯一的水果 for (NSString *fruit in uniqueFruits) { NSLog(@"%@", fruit); } ```
三、集合的性能考量
在使用集合时,性能是一个不可忽视的因素。不同类型的集合在内存使用和访问速度上各有优劣:
- NSArray:适合存储有序数据,适合需要频繁按索引访问的场景。插入和删除元素性能较差。
- NSDictionary:适合需要快速查找和存储关联数据的场景。查找时间复杂度为O(1),但占用内存相对较多。
- NSSet:适合去重和集合运算(如并集、交集等)的场景。相较于NSArray,查找和插入的性能更优,但不能按顺序存储。
四、集合的使用技巧
- 避免在循环中频繁创建集合:应尽量复用集合,减少内存的频繁分配和释放。
- 选择合适的数据结构:根据具体需求选择合适的集合类型,可以提升代码的效率和可读性。
- 利用集合方法:Objective-C中集合类型提供了丰富的方法,合理使用这些方法可以简化代码编写,提高代码质量。
总结
Objective-C的集合类型为开发者提供了强大的数据存储和处理能力。通过合理使用NSArray、NSDictionary和NSSet,可以更高效地管理和操作数据。希望本文的介绍和示例能够帮助读者更好地理解和运用Objective-C中的集合类型,提升开发效率和代码质量。在未来的开发中,合理地选择和使用集合,必将为提高项目的可维护性和性能带来积极的影响。
相关文章:
Objective-C语言的集合
Objective-C语言的集合 引言 Objective-C是一种面向对象的编程语言,主要用于苹果的macOS和iOS系统应用程序的开发。作为C语言的一个超集,Objective-C继承了C语言的优雅,同时又添加了许多强大的特性,使其适合于大型项目的开发。在…...
网络安全与防护策略
随着互联网的普及与信息化程度的不断加深,网络安全问题已成为全球关注的焦点。从个人用户到大规模的企业系统,网络安全威胁的不断演变和升级已成为每个人和组织不可忽视的挑战。无论是恶意软件、钓鱼攻击,还是数据泄露、拒绝服务攻击…...
OpenCV:计算机视觉的强大开源库
文章目录 引言一、什么是OpenCV?1.OpenCV的核心特点 二、OpenCV的主要功能模块1. 核心功能(Core Functionality)2. 图像处理(Image Processing)3. 特征检测与描述(Features2D)4. 目标检测&#…...
Java基础:面向对象进阶(二)
01-static static修饰成员方法 static注意事项(3种) static应用知识:代码块 static应用知识:单列模式 02-面向对象三大特征之二:继承 什么是继承? 使用继承有啥好处? 权限修饰符 单继承、Object类 方法重…...
【MVP 和 MVVM 相比 MVC 有哪些优化点?】
MVP 和 MVVM 相比 MVC 的优化及原因 1. MVC 的痛点 在传统 MVC 模式中: 视图(View)和模型(Model)直接交互:View 可能直接监听 Model 的变化(如观察者模式),导致耦合。…...
ttkbootstrap 实现日期选择器, 开始和结束时间
ttkbootstrap 实现日期选择器, 开始和结束时间 1. 展示 2. 打印 3. 源码 from datetime import datetime import ttkbootstrap as ttkclass DateTimeEntryStart(ttk.Frame):def __init__(self, masterNone, **kwargs):super().__init__(master, **kwargs)self.dat…...
Vulnhub-PrinkysPalacev3
Vulnhub-PrinkysPalacev3 1、主机发现 arp-scan -l 扫描同网段 2、端口扫描 nmap -sS -sV 192.168.66.185 nmap -sS -A -T4 -p- 192.168.66.185 nmap --scriptvuln 192.168.66.185 PORT STATE SERVICE VERSION 21/tcp open ftp vsftpd 2.0.8 or later 5555/tcp o…...
matlab从pytorch中导入LeNet-5网络框架
文章目录 一、Pytorch的LeNet-5网络准备二、保存用于导入matlab的model三、导入matlab四、用matlab训练这个导入的网络 这里演示从pytorch的LeNet-5网络导入到matlab中进行训练用。 一、Pytorch的LeNet-5网络准备 根据LeNet-5的结构图,我们可以写如下结构 import…...
淘宝商品数据爬取与分析
淘宝商品数据爬取与分析是一个涉及网络爬虫技术和数据分析方法的过程,以下是其主要步骤: 数据爬取 确定爬取目标:明确要爬取的淘宝商品类别、具体商品名称或关键词等,例如想要分析智能手机市场,就以 “智能手机” 为…...
Spring Boot向Vue发送消息通过WebSocket实现通信
注意:如果后端有contextPath,如/app,那么前端访问的url就是ip:port/app/ws 后端实现步骤 添加Spring Boot WebSocket依赖配置WebSocket端点和消息代理创建控制器,使用SimpMessagingTemplate发送消息 前端实现步骤 安装sockjs-…...
Django4.0的快速查询以及分页
1. filter 方法 filter 是 Django ORM 中最常用的查询方法之一。它用来根据给定的条件过滤查询集并返回满足条件的对象。 articles Article.objects.all() # 使用 SearchFilter 进行搜索 search_param request.query_params.get(search, None) author_id request.query_pa…...
LangChain/Eliza框架在使用场景上的异同,Eliza通过配置实现功能扩展的例子
LangChain与Eliza框架的异同分析 一、相同点 模块化架构设计 两者均采用模块化设计,支持灵活扩展和功能组合。LangChain通过Chains、Agents等组件实现多步骤任务编排,Eliza通过插件系统和信任引擎实现智能体功能的动态扩展。模块化特性降低…...
用spring-webmvc包实现AI(Deepseek)事件流(SSE)推送
前后端: Spring Boot Angular spring-webmvc-5.2.2包 代码片段如下: 控制层: GetMapping(value "/realtime/page/ai/sse", produces MediaType.TEXT_EVENT_STREAM_VALUE)ApiOperation(value "获取告警记录进行AI分析…...
MusicMint ,AI音乐生成工具
MusicMint是什么 MusicMint 是一款强大的人工智能音乐创作工具,旨在帮助用户轻松制作个性化的音乐作品。借助先进的 AI 技术,用户只需输入简短的描述或选择心仪的音乐风格,便能迅速生成独特的歌曲。该平台支持多种音乐风格,包括流…...
嵌入式学习笔记——SPI协议
SPI协议详解 SPI协议概述SPI接口信号介绍SPI通信模式SPI的通信流程SPI的优缺点优点缺点 SPI在STM32上的实现SPI引脚配置SPI初始化代码(STM32F10x)SPI主设备发送和接收数据SPI从设备数据处理 总结 SPI协议概述 SPI(Serial Peripheral Interfa…...
网络编程—Socket套接字(UDP)
上篇文章: 网络编程—网络概念https://blog.csdn.net/sniper_fandc/article/details/146923380?fromshareblogdetail&sharetypeblogdetail&sharerId146923380&sharereferPC&sharesourcesniper_fandc&sharefromfrom_link 目录 1 概念 2 Soc…...
视频设备轨迹回放平台EasyCVR综合智能化,搭建运动场体育赛事直播方案
一、背景 随着5G技术的发展,体育赛事直播迎来了新的高峰。无论是NBA、西甲、英超、德甲、意甲、中超还是CBA等热门赛事,都是值得记录和回放的精彩瞬间。对于体育迷来说,选择观看的平台众多,但是作为运营者,搭建一套体…...
AIGC实战——CycleGAN详解与实现
AIGC实战——CycleGAN详解与实现 0. 前言1. CycleGAN 基本原理2. CycleGAN 模型分析3. 实现 CycleGAN小结系列链接 0. 前言 CycleGAN 是一种用于图像转换的生成对抗网络(Generative Adversarial Network, GAN),可以在不需要配对数据的情况下将一种风格的图像转换成…...
VS2022远程调试Linux程序
一、 1、VS2022安装参考 VS Studio2022安装教程(保姆级教程)_visual studio 2022-CSDN博客 注意:勾选的时候,要勾选下方的选项,才能调试Linux环境下运行的程序! 2、VS2022远程调试Linux程序测试 原文参…...
345-java人事档案管理系统的设计与实现
345-java人事档案管理系统的设计与实现 项目概述 本项目为基于Java语言的人事档案管理系统,旨在帮助企事业单位高效管理员工档案信息,实现档案的电子化、自动化管理。系统涵盖了员工信息的录入、查询、修改、删除等功能,同时具备权限控制和…...
【Linux系统编程】进程概念,进程状态
目录 一,操作系统(Operator System) 1-1概念 1-2设计操作系统的目的 1-3核心功能 1-4系统调用和库函数概念 二,进程(Process) 2-1进程概念与基本操作 2-2task_struct结构体内容 2-3查看进程 2-4通…...
优选算法的妙思之流:分治——快排专题
专栏:算法的魔法世界 个人主页:手握风云 目录 一、快速排序 二、例题讲解 2.1. 颜色分类 2.2. 排序数组 2.3. 数组中的第K个最大元素 2.4. 库存管理 III 一、快速排序 分治,简单理解为“分而治之”,将一个大问题划分为若干个…...
# 实时人脸识别系统:基于 OpenCV 和 Python 的实现
实时人脸识别系统:基于 OpenCV 和 Python 的实现 在当今数字化时代,人脸识别技术已经广泛应用于各种场景,从手机解锁到安防监控,再到智能门禁系统。今天,我将通过一个完整的代码示例,详细讲解如何使用 Pyt…...
Mysql 中 ACID 背后的原理
在 MySQL 中,ACID 是事务处理的核心原则,用于保证数据库在执行事务时的可靠性、数据一致性和稳定性。ACID 是四个关键特性的首字母缩写,分别是:Atomicity(原子性)、Consistency(一致性ÿ…...
wx206基于ssm+vue+uniapp的优购电商小程序
开发语言:Java框架:ssmuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:M…...
React编程高级主题:错误处理(Error Handling)
文章目录 **5.2 错误处理(Error Handling)概述****5.2.1 onErrorReturn / onErrorResume(错误回退)****1. onErrorReturn:提供默认值****2. onErrorResume:切换备用数据流** **5.2.2 retry / retryWhen&…...
ubuntu20.04升级成ubuntu22.04
命令行 sudo do-release-upgrade 我是按提示输入y确认操作,也可以遇到配置文件冲突时建议选择N保留当前配置...
SpringCloud(25)——Stream介绍
1.场景描述 当我们的分布式系统建设到一定程度了,或者服务间是通过异步请求来通讯的,那么我们避免不了使用MQ来解决问题。 假如公司内部进行了业务合并或者整合,需要服务A和服务B通过MQ的方式进行消息传递,而服务A用的是RabbitMQ&…...
OrangePi5Plus开发板不能正确识别USB 3.0 设备 (绿联HUB和Camera)
1、先插好上电(可正确识别) 2、上电开机后插入USB 3.0 设备,报错如下,只能检测到USB2.0--480M,识别不到USB3.0-5Gbps,重新插拔也不行 Apr 4 21:30:00 orangepi5plus kernel: [ 423.575966] usb 5-1: re…...
centos8上实现lvs集群负载均衡dr模式
1.前言 个人备忘笔记,欢迎探讨。 centos8上实现lvs集群负载均衡nat模式 centos8上实现lvs集群负载均衡dr模式 之前写过一篇lvs-nat模式。实验起来相对顺利。dr模式最大特点是响应报文不经调度器,而是直接返回客户机。 dr模式分同网段和不同网段。同…...
