OC-字符串

前言

本篇文章介绍OC的字符串

字符串常量

要使用Objective-C语言创建一个常量字符串对象,需要在字符串开头放置 一个@字符,下面的语句创建了一个常量字符串

@"Programoning is fun" 

NSLog

NSLog函数可以打印格式化对象,类似于C语言的printf
看下面的例子:

int main(int argc, const char * argv[]) {@autoreleasepool {NSString* a = @"this is a string.";NSLog(@"%@",a);}return 0;
}

注意,在使用NSLog打印对象的时候,其实是打印对象调用description属性返回的字符串对象

这是description属性的原型,该属性是在NSObject类里边定义的。

@property (readonly, copy) NSString *description;

默认情况下,该函数返回类的名称和当前对象的地址。
看下面代码,我们定义一个类A

@interface A : NSObject
@end

下面开始打印A的对象

int main(int argc, const char * argv[]) {@autoreleasepool {A* a = [[A alloc] init];NSLog(@"%@",a);}return 0;
}

返回结果:

<A: 0x600000008030>

现在我们重新给A添加description方法。

@interface A : NSObject
-(NSString*)description;
@end
@implementation A
-(NSString*)description
{return @"this is class A.";
}
@end

再次打印,发现输出结果已经变成

this is class A.

#NSString
NSString对象包含很多方法和属性,下面列出常用的方法

NSString常用方法

类初始化方法

// 创建一个空字符串
+ (instancetype)string;// 创建一个字符串的拷贝,注意,这两个字符串是深拷贝,二者
// 并没有什么关系
+ (instancetype)stringWithString:(NSString *)string NS_FORMAT_ARGUMENT(1);// 通过指定的format和参数argl ,arg2.arg3...
// 创建一个新字符串,这是最常用的方式
+ (instancetype)stringWithFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2);// 创建一个新字符串,并将其设置为url的内容,使用字符编码enc,如果非零,则返回error中的错误
+ (nullable instancetype)stringWithContentsOfURL:(NSURL *)url encoding:(NSStringEncoding)enc error:(NSError **)error;// 创建一个新字符串,并将其设置为path指定的文件的内容,
// 使用字符编码enc,如果非零,则返回error中的错误
+ (nullable instancetype)stringWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc error:(NSError **)error;

实例初始化方法

// 创建一个字符串的拷贝,注意,这两个字符串是深拷贝,二者
// 并没有什么关系
- (instancetype)initWithString:(NSString *)aString NS_FORMAT_ARGUMENT(1);// 通过指定的format和参数argl ,arg2.arg3...
// 创建一个新字符串,这是最常用的方式
- (instancetype)initWithFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2);// 创建一个新字符串,并将其设置为url的内容,使用字符编码enc,如果非零,则返回error中的错误
- (nullable instancetype)initWithContentsOfURL:(NSURL *)url encoding:(NSStringEncoding)enc error:(NSError **)error;// 将字符串设置为Path指定的文件内容
- (nullable instancetype)initWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc error:(NSError **)error;

获取字符串的长度

-(NSUInteger)length;

字符或字符串的查找

如果我们需要查找字符串中的特定字符或者特定字符串,可以使用下面的方法

// 从头开始查询特定字符串A的位置
// 查询规则如下:
// 	1. 如果在字符串中找到A,返回第一个匹配的位置和A的长度
// 	2. 如果没有找到A,匹配位置返回-1,长度返回0
- (NSRange)rangeOfString:(NSString *)searchString;// 查询规则和上面的方法一样,不过多了一个选项
// 一般我们用到的选项有:
// 	1. NSBackwardsSearch,从后向前查询,这个比较常用
// 	2. NSCaseInsensitiveSearch,不考虑字符串的大小写
- (NSRange)rangeOfString:(NSString *)searchString options:(NSStringCompareOptions)mask;

下面是一个根据文件全路径获取文件名称的例子:

-(NSString*)getFileName:(NSString*)path
{NSString* fileName = path;if([path containsString:@"/"]){NSRange range =[path rangeOfString:@"/" options:NSBackwardsSearch];fileName = [path substringFromIndex:range.location+1];}if([fileName containsString:@"."]){NSRange range =[fileName rangeOfString:@"." options:NSBackwardsSearch];fileName =[fileName substringToIndex: range.location];}return fileName;
}

字符串的截取

从头开始截取

// 从头开始截取到to的位置
// 注意:
// 1. to是从0开始的索引
// 2. 不包含to的位置
- (NSString *)substringToIndex:(NSUInteger)to;

看下面例子:

NSString * s = @"0123456789";
NSLog(@"%@",[s substringToIndex:3]);

运行结果:

012

从某个位置开始

// 从from开始截取,一直到最后
// 注意:
// 1. from是从0开始的索引
// 2. 包含from的位置
- (NSString *)substringFromIndex:(NSUInteger)from;

看下面例子:

NSString * s = @"0123456789";
NSLog(@"%@",[s substringFromIndex:3]);

运行结果:

3456789

范围截取

// 使用range表示的范围截取字符串
// 注意:
// 截取包含range的开始位置
// 必须保证range在正确范围内,否则会崩溃
- (NSString *)substringWithRange:(NSRange)range;

看下面例子:

NSString * s = @"0123456789";
NSRange range = NSMakeRange(3, 4);
NSLog(@"%@",[s substringWithRange:range]);

运行结果:

3456

字符串比较

// 比较两个字符串
- (NSComparisonResult)compare:(NSString *)string;// 比较两个字符串,忽略大小写
- (NSComparisonResult)caseInsensitiveCompare:(NSString *)string;

NSComparisonResult是一个枚举类型,有三个值

  • NSOrderedAscending:表示小于,该值为-1
  • NSOrderedSame:表示等于,该值为0
  • NSOrderedDescending:表示大于,该值为1
    对于
[A compare:B]

具体的比较规则是这样的:
从头开始比较A和B的每个字符:

  • 如果B已经到头了,A还没有到头,则A>B,结束
  • 如果A已经到头了,B还没有到头,则A<B,结束
  • 如果A和B都到头了,则A==B,结束,否则,执行下一步。
  • 如果A的字符值比B小,则A<B,结束
  • 如果A的字符值比B大,则A>B,结束
  • 否则,跳到第一步,比较下个字符。

字符串首尾包含判断

// 测试字符串是否以str开始
- (BOOL)hasPrefix:(NSString *)str;// 测试字符串是否以str结束
- (BOOL)hasSuffix:(NSString *)str;

字符串相等

// 比较两个字符串是否相等
- (BOOL)isEqualToString:(NSString *)aString;

注意:比较两个字符串内容是否相等的话千万别用==,用这个方法

看下面的例子:

NSString * s = @"0123456789";
NSString * s1 = @"01234567";
NSString * s2 = [s1 stringByAppendingString:@"89"];
if(s == s2)
{NSLog(@"s==s2");
}
else
{NSLog(@"s!=s2");
}

这个例子打印结果会是s!=s2
如果我们用isEqualToString,就会打印s==s2

大小写转换

// 将字符串的所有字母变为大写
@property (readonly, copy) NSString *uppercaseString;// 将字符串的所有字母变为小些
@property (readonly, copy) NSString *lowercaseString;//将每个单词的首字母变为大写,其余字母变为小写
@property (readonly, copy) NSString *capitalizedString;

与数字之间的转换

@property (readonly) double doubleValue;
@property (readonly) float floatValue;
@property (readonly) int intValue;
@property (readonly) NSInteger integerValue API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0));
@property (readonly) long long longLongValue API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0));
@property (readonly) BOOL boolValue API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0),

NSMutableString

当我们使用NSString创建一个字符串的时候,默认是一个不可变字符串,也就是说无论是我们截取字符串,或者对字符串进行大小写切换,都会产生一个新的字符串,看下面的例子:

NSString * s = @"01234567890";
NSString * s1 = [s stringByAppendingString:@"0"];
NSString * s2 = [s substringToIndex:3];
NSString * s3 = [s substringFromIndex:3];
NSString * s4 = [s uppercaseString];
NSLog(@"&s = %p",s);
NSLog(@"&s = %p",s1);
NSLog(@"&s = %p",s2);
NSLog(@"&s = %p",s3);
NSLog(@"&s = %p",s4);

下面是一个打印结果

&s = 0x100004088
&s = 0x600000c00ba0
&s = 0xa747e51693e8bc7d
&s = 0xa7790060eba60aa5
&s = 0x600000c00bd0

每个字符串都有一个新的地址。

NSMutableString是可变字符串,是NSString的子类,NSMutableString在内部使用可变数组保存字符数据,下面是NSMutableString常用的方法

类初始化方法

// capacity是初始化字符串时分配的数组大小
+ (NSMutableString *)stringWithCapacity:(NSUInteger)capacity;

实例初始化方法

- (NSMutableString *)initWithCapacity:(NSUInteger)capacity;

赋值

// 将字符串设置为aString
- (void)setString:(NSString *)aString;

拼接

// 将字符串拼接到现在字符串的后面
- (void)appendString:(NSString *)aString;// 使用格式化字符串进行拼接
- (void)appendFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2);

删除

// 删除指定范围的字符串
- (void)deleteCharactersInRange:(NSRange)range;

插入

// 在loc位置的前面插入字符串
- (void)insertString:(NSString *)aString atIndex:(NSUInteger)loc;

替换

// 用字符串aString替换现在字符串range区域
- (void)replaceCharactersInRange:(NSRange)range withString:(NSString *)aString;// 使用字符串replacement替换所有的target
- (NSUInteger)replaceOccurrencesOfString:(NSString *)target withString:(NSString *)replacement options:(NSStringCompareOptions)options range:(NSRange)searchRange;

综合实力

下面是一个综合的例子

NSMutableString* ms = [NSMutableString stringWithCapacity:20];
NSLog(@"&ms = %@",ms);
[ms setString:@"start::"];
NSLog(@"&ms = %@",ms);
[ms appendString:@"appendString,"];
NSLog(@"&ms = %@",ms);
[ms appendFormat:@"appendFormat%i",123];
NSLog(@"&ms = %@",ms);
[ms deleteCharactersInRange:NSMakeRange(ms.length-3, 3)];
NSLog(@"&ms = %@",ms);
[ms insertString:@"ecalper" atIndex:0];
[ms insertString:@"replace" atIndex:ms.length];
NSLog(@"&ms = %@",ms);
[ms replaceCharactersInRange:NSMakeRange(0, 7) withString:@"replace"];
NSLog(@"&ms = %@",ms);
[ms replaceOccurrencesOfString:@"replace" withString:@"" options:0 range:NSMakeRange(0, ms.length)];
NSLog(@"&ms = %@",ms);

结果如下:

&ms =
&ms = start::
&ms = start::appendString,
&ms = start::appendString,appendFormat123
&ms = start::appendString,appendFormat
&ms = ecalperstart::appendString,appendFormatreplace
&ms = replacestart::appendString,appendFormatreplace
&ms = start::appendString,appendFormat

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/646053.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript进阶教程- 箭头函数和this关键字

在JavaScript中&#xff0c;箭头函数是ES6中引入的一种新的函数语法。它们提供了一种更简洁的方式来写函数&#xff0c;并且对 this 关键字的行为有特殊的处理。 箭头函数&#xff08;Arrow Functions&#xff09; 箭头函数使用一个“箭头”&#xff08;>&#xff09;定义…

数据结构之树

树 前面文章讲的线性表&#xff0c;不论数组还是链&#xff0c;都是“一对一”的关系&#xff0c;本文章节让我们来认识一下“一对多”关系的数据结构——树&#xff08;Tree&#xff09;。 树结构分为二叉树和三叉树等&#xff0c;如下图所示。常用的就是二叉树&#xff0c;因…

深度学习(5)--Keras实战

目录 一.Keras基础概念 二.如何跑通Keras项目 2.1.在cmd上跑通 2.2.在PyCharm上跑通 一.Keras基础概念 Keras是深度学习中的一个神经网络框架&#xff0c;是一个高级神经网络API&#xff0c;用Python编写&#xff0c;可以在TensorFlow&#xff0c;CNTK或Theano之上运行。 …

开发相关的工具及AI算法调研【降本增效】

前置说明: 看各个章节总结即可了解章节调研结果 开发降本增效调研可用工具参考以下几块: 总结 以下是实现软件开发降本增效的主要流程,将调研涉及该过程的可用工具或方法。 1、需求收集和分析 效率从软件项目的最初阶段开始——需求收集和分析阶段。这一阶段经常被忽视…

如何保护电脑数据?电脑数据怎么保护?

电脑会储存大量的重要数据&#xff0c;而为了避免数据泄露&#xff0c;必须要使用专业的方式进行保护。那么&#xff0c;要如何保护电脑数据呢&#xff1f;下面我们就来了解一下。 文件夹加密超级大师 文件夹加密超级大师是一款专业的电脑数据加密软件&#xff0c;拥有强大的文…

医疗天使禅道使用工作流程:优化医疗服务的必经之路

目录 博客前言 医疗天使禅道使用工作流程 一.使用最高管理员账号admin管理组织结构 1.新增用户 产品经理使用禅道 1.创建产品 2.添加产品模块​编辑 3.添加产品计划 4.添加产品需求 5.创建项目 6.设置团队 项目经理使用禅道 1.关联需求 2.分解任务 测试主管使用禅…

Swiper轮播图后端接口实现

mybatis-plus:global-config:db-config:id-type: auto #id生成规则&#xff1a;数据库id自增configuration:map-underscore-to-camel-case: false # 开启驼峰功能auto-mapping-behavior: full # 自动映射任何复杂的结果log-impl: org.apache.ibatis.logging.stdout.StdOutImpl…

200G数据中心:QSFP56和QSFP-DD光模块如何选择?

随着光通信与互联网技术的迅猛发展&#xff0c;网络数据流量的需求呈指数级增长&#xff0c;电信骨干网流量年均增速高达50%至80%。为了应对日益攀升的数据传输需求&#xff0c;光通信速率实现了从10G、25G、40G到当前主流的100G、200G、400G甚至更高规格的持续演进。 在此背景…

Flutter中状态管理选项的比较:利弊探索

Flutter 应用程序开发的一个关键方面是管理状态&#xff0c;这确保了整个应用程序的数据一致性和更新。然而&#xff0c;Flutter 提供了多种状态管理解决方案&#xff0c;每种解决方案都有自己的优缺点。在这篇博客中&#xff0c;我们将探讨 Flutter 中一些流行的状态管理选项&…

TestNG @BeforeClass 注解

目录 那么&#xff0c;这个带BeforeClass注释的方法什么时候执行呢&#xff1f; 如果我们在一个类中放置多个BeforeClass注释方法会发生什么&#xff1f; 在这篇文章中&#xff0c;我们将讨论TestNG中的BeforeClass注释。BeforeClass注释方法将在特定类的测试用例之前运行。…

Linux-共享内存

文章目录 前言一、system V共享内存申请共享内存挂载共享内存删除共享内存挂载删除共享内存 二、示例代码三.运行效果 前言 在这之前我们已经学习了两种进程间通信方式&#xff1a;匿名管道和命名管道。 从我们之前的学习已经知道&#xff0c;想让多个进程间进行通信就需要让他…

Spring框架--Spring入门实验二之依赖注入

目录 引言 1、依赖注入之setter注入 2、依赖注入之构造器注入 3、为类类型属性赋值&#xff08;依赖注入之对象注入&#xff09; 4、为数组类型属性赋值 引言 Spring框架中的依赖注入&#xff08;Dependency Injection&#xff0c;DI&#xff09;是一种设计模式和编程实践…

前端JavaScript篇之intanceof 操作符的实现原理及实现、为什么0.1+0.2 ! == 0.3,如何让其相等

目录 intanceof 操作符的实现原理及实现为什么0.10.2 ! 0.3&#xff0c;如何让其相等 intanceof 操作符的实现原理及实现 instanceof 是一个用于检查对象是否属于特定类的 JavaScript 操作符。它返回一个布尔值&#xff0c;指示对象是否是特定类的实例或者原型链中是否存在该…

Tensorflow 中的损失函数 —— loss 专题汇总

回归和分类是监督学习中的两个大类。自学过程中&#xff0c;阅读别人代码时经常看到不同种类的损失函数&#xff0c;到底 Tensorflow 中有多少自带的损失函数呢&#xff0c;什么情况下使用什么样的损失函数&#xff1f;这次就来汇总介绍一下。 一、处理回归问题 1. tf.losses…

Vue组件点击事件不触发的问题,添加事件修饰符native解决

目录 一、父组件在子组件上绑定方法&#xff0c;点击不触发 .native是什么&#xff1f; 二、其他事件修饰符 .stop .prevent .capture .self .once .passive 三、子组件触发父组件方法 四、父组件调用子组件方法 一、父组件在子组件上绑定方法&#xff0c;点击不触发…

常见の算法

前言本文主要使用Java 什么&#xff0c;是快乐星球#&#xffe5;%……什么是算法&#xff1f; 算法是一组完成任务的指令。任何代码片段都可视为算法&#xff0c;但我们主要介绍常见算法 一、引入——二分查找 二分查找是一种算法&#xff0c;其输入是一个有序的元素列表。如…

java获取一段音频/mp3的时长

引言 在日常开发中&#xff0c;经常会遇到产品经理提出一个需求“上传音乐/音频”&#xff0c;而且还得显示出音频的播放时长。那我们直接世界上最简单的实现方案&#xff0c;必须是最简单&#xff0c;多一句啰嗦不准点赞。 How to do 1.提前引入包 <!--视频多媒体工具包…

浏览器实用:禁止浏览器http自动转成https

前言 因为有些网站支持http和https两种协议访问&#xff0c;有些只支持一种协议访问。但根据动态域名安全策略&#xff08;HSTS&#xff09;&#xff0c;只要该域名在浏览器中访问过一次https&#xff0c;那么浏览器将强制使http的请求变为https。 虽然这条浏览器的策略有利于提…

【oshi-core依赖】Java获取计算机的内存信息、磁盘信息、CPU信息

这篇文章,主要介绍Java如何获取计算机内存信息、磁盘信息、CPU信息【知识星球】。 目录 一、获取系统信息 1.1、引入依赖 1.2、SystemInfo类

Flink入门教程

使用flink时需要提前准备好scala环境 一、创建maven项目 二、添加pom依赖 <properties><scala.version>2.11.12</scala.version></properties><dependency><groupId>org.scala-lang</groupId><artifactId>scala-library<…