Swift字符串和字符

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
查看查看198 回复回复1 收藏收藏 分享淘帖 转播转播 分享分享 微信
查看: 198|回复: 1
收起左侧

Swift字符串和字符

[复制链接]
女汉子 发表于 2016-8-22 04:55:05 | 显示全部楼层 |阅读模式
快来登录
获取优质的苹果资讯内容
收藏热门的iOS等技术干货
拷贝下载Swift Demo源代码
订阅梳理好了的知识点专辑

String类型是一种快速、现代化的字符串实现,每一个字符串都是由编码无关的Unicode字符组成,并支持访问字符的多种Unicode表示形式,如:UTF8、UTF16等。字符串的内容都是由一个个的Character组成。

本篇是学习Swift中的字符串操作相关知识点,记录下所有学习的关键技术点和知识点!

Swift字符串和字符

Swift字符串和字符 - 敏捷大拇指 - Swift字符串和字符





0、字符串操作

在开发中,对字符串、字符常用的操作有:

  • 初始化空字符串
  • 使用可变、不可变字符串
  • 字符串是值类型
  • 与NSString互转
  • 计算字符数量
  • 比较字符串
  • 连接字符串和字符
  • 获取、删除、添加、修改字符/字符串
  • 分割字符串


注意:Swift的String类型与Foundation NSString类进行了无缝桥接,因此这两者可以直接互转,然后可调用对应的类型的所有API。




1、初始化空串

初始化空字符串有三种方式,分别为:

  • 直接使用双引号
  • 使用String结构体的无参构造函数
  • 使用String结构体的有参构造函数,但参数传双引号


[Swift] 纯文本查看 复制代码
var string = "" // 空字符串
string = String() // 空字符串
string = String("")// 空字符串


字符Character最常用的构造函数:

[Swift] 纯文本查看 复制代码
/// 根据一个只有一个字符的字符串创建一个`Character`
///
/// 要求参数s字符串中只能包含一个字符
public init(_ s: String)


对于初始化字符常用的方式:

[Swift] 纯文本查看 复制代码
// 对于构造函数:public init(_ s: String)
// 我们必须保证所传的参数`s`字符串中最多包含一个字符,否则会`Crash`掉
var c = Character("1")// OK
var cc = Character("10") // Factal error
 
// 上面使用构造的方法与下面这种直接赋值的方式是一样的,实际上也是通过转换成构造函数`public init(_ s: String)`来初始化
var c: Character = "A"





2、可变与不可变

对于Swift中的String字符串,若要声明不可变字符串,使用let关键字声明为常量字符串即可;若是要让字符串可变,使用var关键字声明就可以了。与OjbectiveC不一样,使用NSString声明为不可变字符串,使用NSMutableString声明为可变字符串。相比之下,自然是Swift的String结构体使用起来更简单。

对于不可变字符串,是不能执行增、删、改操作的,因此下面会报错: Cannot use mutating member on immutable value: ‘str’ is a ‘let’ constant。意思是:str是用let声明的常量,不能对不可变值使用可变成员(方法、属性)。

[Swift] 纯文本查看 复制代码
let str = ""
str.append(Character("1"))


当我们修改为var声明字符串为变量str,就可以直接添加字符了:

[Swift] 纯文本查看 复制代码
var str = ""
str.append(Character("1")) // OK 


对于字符Character与String一样,使用let声明为常量就不能再修改其值,使用var声明为变量就可以在运行时修改其值。

[Swift] 纯文本查看 复制代码
var cc = "A"
cc = "b"// Ok
 
let c = "C"
c = "c" // Factal error





3、字符串是值类型

注意,String类型是结构体,因此它是值类型,而不是引用类型。所有在使用字符串的时候,不会有引用计数的说法了,在传值时,会进行值拷贝而不是引用。

[Swift] 纯文本查看 复制代码
string = "值拷贝"
func testStringCopy(var str: String) {
  str = "这里新值"
  print(str)
}
testStringCopy(string) // 这里新值
print(string) // 值拷贝


打印结果如下,说明这是值拷贝,外部的字符串变量string不会被函数内部的字符串变量str所修改:

[Swift] 纯文本查看 复制代码
这里新值
值拷贝





4、与NSString互转

Swift中的String与Foundation中的NSString进行了无缝桥接,因此我们在使用中可以直接让这两种类型直接互转,不会出现失败。

[Swift] 纯文本查看 复制代码
var ss = "String中并不包含所有的NSString的方法"
var nss = ss as NSString // OK
 
var str = nss as String // OK


但是,我们不能直接将String转换成NSMutableString。由于String与NSString是无缝桥接的,因此转换必定成功,直接使用as转换即可。

提示:类型转换使用关键字as,如果转换有可能失败,则需要使用as?。如果认为一定不会失败,我们可以使用强制转换as!,但是一旦失败就会崩溃。




5、计算字符数量

计算字符串的字符的个数与NSString的不一样,没有length方法。在String中,对字符的操作,主要是通过其属性characters来操作。

[Swift] 纯文本查看 复制代码
let str = "计算字符串de个数"
print(str.characters.count) // 9


当前我们也可以通过直接转换成NSString再获取其长度:

[Swift] 纯文本查看 复制代码
let name = str as NSString
print(name.length) // 9


在实际开发中,本人不希望这样类型转换再操作,因此,我会扩展String,添加length方法:

[Swift] 纯文本查看 复制代码
extension String {
  func hyb_length() ->Int {
    return self.characters.count
  }
}


这样我们就可以直接使用:

[Swift] 纯文本查看 复制代码
print(str.hyb_length) // 9


注意:看到扩展的方法前面为什么要添加前缀呢?考虑到多人开发时,难免会冲突,因此使用前缀可以很好的解决冲突问题。比如,我们公司6个组同时对同一个App进行开发,只是各自分处不同的业务线,因此大家都会添加一些常用的扩展API,而且大家都会导入第三方库,经常出现同名的API,因此很容易造成冲突。前缀一般都使用项目简写或者公司简写名再加一个下划线。




6、比较字符串

对于字符串String的比较,与NSString相比,简单了很多,因此Swift支持重载函数和符号函数,因此,就可以直接定义==、!=函数。判断是否相等,使用两个等号==,不相等就用!=就可以了。

[Swift] 纯文本查看 复制代码
if str != "谢谢" {
  print("不相等")
}
 
if "谢谢" == "谢谢" {
  print("肯定相等")
}


通常我们还会对字符串的前缀、后缀比较:

[Swift] 纯文本查看 复制代码
if str.hasPrefix("字符串") {
  print("有...")
}
 
if str.hasSuffix("连接") {
  print("有...")
}


还可以直接判断是否包含某个子串:

[Swift] 纯文本查看 复制代码
print(str.containsString("符"))// true


判断是否为空串,可以使用==判断,也可以直接获取其属性isEmpty,注意它不是一个函数:

[Swift] 纯文本查看 复制代码
print(str.isEmpty)// false
 
print(str == "") // false


虽然两者都有两样的效果,但是推荐使用isEmpty,可读性更强一些。




7、连接字符串和字符

在Swift中,对String字符串类型操作,比NSString要简单多了,拼接字符串,可直接使用+=符号函数,也可以使用\(变量名)这种方式插入,还可以使用append方法添加字符。

[Swift] 纯文本查看 复制代码
var str = "字符串连接"
 
// str=字符串连接值拷贝,string=值拷贝
str += string 
 
// 使用\(变量、常量、函数返回值等)
str = "\(str)\(string)"
 
// 注意,由于"A"这么写编译器无法识别是字符还是字符串,
// 且append只能追加一个字符,不能追加字符串
//str.append("A")// 提示:mutating func append(c: Character)
str.append(Character("A"))// 传类型强转换就可以了
 
// 如果是追加字符串,可以使用`write`方法
str.write("顶起")
print(str)





8、增删改查字符/字符串

对于删除、添加、修改字符串,只是对可变字符串有效。

添加字符串的与上面的连接字符串和字符是一样的。关于write方法和append方法有多个函数,自己再深入学习。当然还有insert方法、appendContentsOf等。

删除字符:

清空字符串可以使用removeAll等方法,也可以直接使用双引号:

[Swift] 纯文本查看 复制代码
// 传true参数,表示内容清除,但容量不变
str.removeAll(keepCapacity: true)
// 使用默认值,容量会清掉
str.removeAll()
 
// 也可以使用这样:
str = ""
 
// 还可以直接使用删除范围函数:
str.removeRange(Range(start: str.startIndex, end: str.endIndex))


删除部分字符:

[Swift] 纯文本查看 复制代码
// 删除第一个字符
str.removeAtIndex(str.startIndex)
 
// 删除第一个字符
str.characters.removeFirst()
 
// 删除最后一个字符
str.characters.removeLast()
 
// 删除某个函数
str.removeRange(Range(start: str.startIndex, end: str.endIndex))


修改字符串:

我们主要是使用replaceRange方法:

[Swift] 纯文本查看 复制代码
let range = str.rangeOfString("顶起")
str.replaceRange(range!, with: "被替换的值")
print(str)


获取字符串、字符

通过循环的方式来遍历:

[Swift] 纯文本查看 复制代码
for c in str.characters {
  print(c)
}


如果在遍历中需要知道其索引和值,可以通过快速枚举:

[Swift] 纯文本查看 复制代码
for (index, c) in str.characters.enumerate() {
  print("c = \(c), index= \(index)")
}


下面这种方式是非常少用的,因为非常不好用:

[Swift] 纯文本查看 复制代码
for var index = 0; index < str.characters.count; ++index {
   // 不能直接使用str[index]获取,也没有str.characters[index]
}





9、分割字符串

最常用的方法就是componentsSeparatedByString,会返回一个数组:

[Swift] 纯文本查看 复制代码
str.componentsSeparatedByString("被")





小结

本篇文章是挺久以前写的了,今天只是更新一下文章的格式,如果文中出现比较旧的知识,大家可以在评论中指出。毕竟Swift更新太快了,笔者现在也没有及时地跟进!




作者:huangyibiao

都看到这里了,就把这篇资料推荐给您的好朋友吧,让他们也感受一下。

回帖是一种美德,也是对楼主发帖的尊重和支持。

*声明:敏捷大拇指是全球最大的Swift开发者社区、苹果粉丝家园、智能移动门户,所载内容仅限于传递更多最新信息,并不意味赞同其观点或证实其描述;内容仅供参考,并非绝对正确的建议。本站不对上述信息的真实性、合法性、完整性做出保证;转载请注明来源并加上本站链接,敏捷大拇指将保留所有法律权益。如有疑问或建议,邮件至marketing@swifthumb.com

*联系:微信公众平台:“swifthumb” / 腾讯微博:@swifthumb / 新浪微博:@swifthumb / 官方QQ一群:343549891(满) / 官方QQ二群:245285613 ,需要报上用户名才会被同意进群,请先注册敏捷大拇指

嗯,不错!期待更多好内容,支持一把:
支持敏捷大拇指,用支付宝支付10.24元 支持敏捷大拇指,用微信支付10.24元

评分

参与人数 1金钱 +10 贡献 +10 专家分 +10 收起 理由
Anewczs + 10 + 10 + 10 32个赞!专家给力!

查看全部评分

young 发表于 2016-8-29 17:39:14 | 显示全部楼层
这个无缝桥接不错!

Swift中的String与Foundation中的NSString进行了无缝桥接

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

做任务,领红包。
我要发帖

分享扩散

都看到这里了,就把这资料推荐给您的好朋友吧,让他们也感受一下。
您的每一位朋友访问此永久链接后,您都将获得相应的金钱积分奖励
热门推荐

合作伙伴

Swift小苹果

  • 北京治世天下科技有限公司
  • ©2014-2016 敏捷大拇指
  • 京ICP备14029482号
  • Powered by Discuz! X3.1 Licensed
  • swifthumb Wechat Code
  •   
快速回复 返回顶部 返回列表