Swift -字符串详解
2015-12-30 22:18
381 查看
Swift 的字符串 API 似乎让人难以习惯。此外,每次
Swift 与其标准库版本更新的时候,字符串的 API 也时不时会发生改变。你在 Stack Overflow 上寻找到的 Swift 1.2 解决方案往往不能在 Swift 2 上按照预期(甚至完全不能)使用。虽然从好的方面来看,我发现苹果的官方文档是非常有用的(参见本文底部的链接),但是出于备查的目的以及为了帮助仍挣扎于其中的人们,在此我仍旧了列出一系列的 String 代码片段:
(Gist 和我 Github 仓库中的 Playground 都已提供)
字符串初始化
创建一个字符串对象有无数种方式可以使用,包括字面量、从其他 Swift 类型转换、Unicode等等。
字符串是值类型
字符串是值类型(Value Type),当用其赋值或者函数传参的时候它会被拷贝(copied)。所拷贝的值在修改的时候是懒加载的(lazy)。
字符串检测(空值、等值以及次序)
检测一个字符串是否为空:
Swift 是支持 Unicode 编码的,因此相等运算符("==")将会判断 Unicode 的范式是否等价(canonical equivalence)。这意味着对于两个字符串来说,如果拥有相同的语义(linguistic meaning)和表现形式的话,即使它们由不同 Unicode 标量(scalar)组成,那么也认为这两个字符串相等:
比较次序的话:
前缀/后缀检测
检测一个字符串是否拥有某个前缀或者后缀:
大小写互相转换
顾名思义:
字符集合
字符串并不是某种编码的字符集合(collection views),但是它可以通过相应的属性为不同的编码形式提供所对应的字符集合。
字符总数
字符串并没有一个直接的属性用以返回其包含的字符总数,因为字符总数只对特定的编码形式来说才有意义。因此,字符总数需要通过不同编码的字符集合来访问:
使用索引来访问字符集合
每个字符集合都拥有“索引”,可以通过它来访问整个集合中的元素。这或许是在使用字符串过程中碰到的最大难点之一了。你不能使用下标语法来访问字符串中的任意元素(比如说string[5])。
要遍历某个集合中的所有元素的时候(从现在开始我都将使用 characters 集合),可以通过 for...in 循环来进行:
每个集合都有两个实例属性,你可以在集合中使用它们来进行索引,就如同下标语法哪样:
startIndex:返回首个元素的位置,如果为空,那么和 endIndex 的值相同。
endIndex:返回字符串逾尾(past the end)的位置。
注意到如果使用 endIndex 的话,就意味着你不能直接将其作为下标来进行使用,因为这会导致越界。
当通过以下几种方法进行字符串修改的时候,startIndex 和 endIndex 就变得极其有用:
successor():获取下一个元素
predecessor():获取上一个元素
advancedBy(n):向前或者向后跳 n 个元素
下面是一些用例,注意到如果必要的话你可以将操作串联起来:
Indices 属性将返回字符串中所有元素的范围,这在遍历集合的时候很有用:
你无法使用某个字符串中的索引来访问另一个字符串。你可以通过 distanceTo 方法将索引转换为整数值:
范围的使用
要检出字符串集合中某个范围内的元素的话,可以使用范围。范围可以通过 start 和 end 索引来完成创建:
使用 "..." 或者 "..<" 运算符可以快速完成范围的创建:
通过索引或者范围来截取字符串
要通过索引或者范围来截取字符串的话,有许多方法:
获取前缀或者后缀
如果你需要得到或者抛弃字符串前面或者后面的某些元素的话,可以:
插入或删除
要在指定位置插入字符的话,可以通过索引:
要在索引出插入字符串的话,那么需要将字符串转换为字符集:
范围替换
要替换一个范围的字符串内容的话:
添加元素
可以通过“+”运算符将字符串相互连接起来,也可以使用 appendContentsOf 方法:
移除或者返回指定索引的元素
从一个字符串当中移除某个元素,需要注意这个方法将会使该字符串此前所有的任何索引标记(indice)失效:
范围移除
移除字符集中某个范围的字符,需要主要的是这个方法同样也会使索引标记失效:
与 NSString 桥接
String 可以转换为 NSString 从而与 Objective-C 桥接。如果 Swift 标准库没有你所需要的功能的话,那么导入 Foundation 框架,通过 NSString 来访问这些你所需要的方法。
请注意这个桥接方法并不是无损的,因此尽可能使用 Swift 标准库完成大部分功能。
检索内含的字符串
使用 NSString 方法的一个例子就是执行内含字符串的检索:
Playgournd
我发现在 Xcode 中通过 Playground 来熟悉 API 是一个非常好的选择。如果你想要抢先体验一下所有这些功能的话,这个文章的 Playground 可以从我的
Github 仓库中下载。
Swift 与其标准库版本更新的时候,字符串的 API 也时不时会发生改变。你在 Stack Overflow 上寻找到的 Swift 1.2 解决方案往往不能在 Swift 2 上按照预期(甚至完全不能)使用。虽然从好的方面来看,我发现苹果的官方文档是非常有用的(参见本文底部的链接),但是出于备查的目的以及为了帮助仍挣扎于其中的人们,在此我仍旧了列出一系列的 String 代码片段:
(Gist 和我 Github 仓库中的 Playground 都已提供)
字符串初始化
创建一个字符串对象有无数种方式可以使用,包括字面量、从其他 Swift 类型转换、Unicode等等。
字符串是值类型(Value Type),当用其赋值或者函数传参的时候它会被拷贝(copied)。所拷贝的值在修改的时候是懒加载的(lazy)。
检测一个字符串是否为空:
检测一个字符串是否拥有某个前缀或者后缀:
顾名思义:
字符串并不是某种编码的字符集合(collection views),但是它可以通过相应的属性为不同的编码形式提供所对应的字符集合。
字符串并没有一个直接的属性用以返回其包含的字符总数,因为字符总数只对特定的编码形式来说才有意义。因此,字符总数需要通过不同编码的字符集合来访问:
每个字符集合都拥有“索引”,可以通过它来访问整个集合中的元素。这或许是在使用字符串过程中碰到的最大难点之一了。你不能使用下标语法来访问字符串中的任意元素(比如说string[5])。
要遍历某个集合中的所有元素的时候(从现在开始我都将使用 characters 集合),可以通过 for...in 循环来进行:
startIndex:返回首个元素的位置,如果为空,那么和 endIndex 的值相同。
endIndex:返回字符串逾尾(past the end)的位置。
注意到如果使用 endIndex 的话,就意味着你不能直接将其作为下标来进行使用,因为这会导致越界。
successor():获取下一个元素
predecessor():获取上一个元素
advancedBy(n):向前或者向后跳 n 个元素
下面是一些用例,注意到如果必要的话你可以将操作串联起来:
要检出字符串集合中某个范围内的元素的话,可以使用范围。范围可以通过 start 和 end 索引来完成创建:
通过索引或者范围来截取字符串
要通过索引或者范围来截取字符串的话,有许多方法:
获取前缀或者后缀
如果你需要得到或者抛弃字符串前面或者后面的某些元素的话,可以:
要在指定位置插入字符的话,可以通过索引:
要替换一个范围的字符串内容的话:
添加元素
可以通过“+”运算符将字符串相互连接起来,也可以使用 appendContentsOf 方法:
从一个字符串当中移除某个元素,需要注意这个方法将会使该字符串此前所有的任何索引标记(indice)失效:
移除字符集中某个范围的字符,需要主要的是这个方法同样也会使索引标记失效:
String 可以转换为 NSString 从而与 Objective-C 桥接。如果 Swift 标准库没有你所需要的功能的话,那么导入 Foundation 框架,通过 NSString 来访问这些你所需要的方法。
请注意这个桥接方法并不是无损的,因此尽可能使用 Swift 标准库完成大部分功能。
使用 NSString 方法的一个例子就是执行内含字符串的检索:
我发现在 Xcode 中通过 Playground 来熟悉 API 是一个非常好的选择。如果你想要抢先体验一下所有这些功能的话,这个文章的 Playground 可以从我的
Github 仓库中下载。
相关文章推荐
- Android之获取手机上的图片和视频缩略图thumbnails
- android string.xml文件中的整型和string型代替
- Android java 与 javascript互访(相互调用)的方法例子
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 数据库链接字符串查询网站
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- android上改变listView的选中颜色
- String.intern
- Apple Swift学习教程
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- 介绍 Fedora 上的 Swift
- Prototype源码浅析 String部分(二)
- Flex字符串比较 还有Flex字符串操作
- Ruby中的String对象学习笔记
- Ruby中创建字符串的一些技巧小结