Swift 个人学习笔记 - 04: 字符串和字符

amc

本文章纯粹是中文版《The Swift Programming Language》的学习笔记,所以绝大部分的内容都是文中有的。本文是本人的学习笔记,不是正式系统的记录。仅供参考

以下还是有很多没看懂、不确定的地方,我会以“存疑”的注解指出。

在此感谢中文版翻译者,这极大地加快了 Swift 的学习速度。

本文地址:https://segmentfault.com/a/1190000008369289


Reference:

原版:The Swift Programming Language
中文版:Swift 3 编程语言

概述

字符串在 Swift 里面其实是 String 对象,而不是基本数据类型。不过说实话,个人觉得在 Swift 里面基本数据类型和对象的差别并没有那么明显(不确定)。

字符在 Swift 里面则是 Character,到底是对象还是基本数据类型,本人目前还不是很清楚。

字符串和字符的创建和修改

创建和访问

字符串和字符的最基本创建方式,就是直接像普通变量那样创建就可以(常量我就忽略啦):

var aStr = "Hello string"
var aChr = "H"
var aEmptyStr = String()
var anotherEmptyStr = ""

字符串可以说是对应着 Objective-C 中的 NSStringNSMutableString 类型。不过你不用担心 String 类型到底是可变还是不可变的。String 是一个值类型,底层的值变化由 Swift 自行完成,程序员只需要把它当作 mutable string 来用就可以了。

不过如果与 Foundation 搭配使用的话,那么只能对应 NSString 的方法,不能对应 NSMutableString 方法。

修改和比较

String 类型可以进行修改,比如使用 +=, +等操作符。

String 类型可以比较。如果使用 == 操作符,那么字符串使用的是称为 “规范化相等” 的规则。规范化相等的定义在后文扩展字形集群说明。

同理,Character 类型的 == `也是规范化相等。

Unicode

StringCharacter 使用 Unicode 保存数据。这与 Objective-C 是对应的 (NSString 和 unichar)。这里要说明一下这两个类型中关于 Unicode 的一些性质了。

Unicode 标量表示

一个 Unicode 标量是一个为字符或者修饰符创建的独一无二的 21 位数字。

特殊转义字符:

\0, \\, \t, \n, \r, \", \'

任意的 Unicode 标量:

\u{十六进制数}    // 十六进制数为 1~8 个十六进制字符,无需 “0x” 前缀

扩展字形集群

原文说明得很复杂很严谨,这里简单举例就好。比如一个字母 “é”,有两种表示方法:

  1. 单个 Unicode 标量 é (LATIN SMALL LETTER E WITH ACUTE, 或者 U+00E9) 表示
  2. 一个标准的字母 e ( LATIN SMALL LETTER E,或者说 U+0065),以及 COMBINING ACUTE ACCENT 标量 (U+0301) 表示

这两种表示方法,作为字符比较或者字符串比较时,都是相等的,称为规范化相等
同样的东西,在韩文中也很常用。

字符串的 Unicode 表示法

分别使用 utf8utf16unicodeScalars 来获得字符按照三种不同表示法的数组。
三者返回的分别是UInt8Uint16Uint32数组

常用方法

  • 获取指定位置的字符aStr[位置]
  • 获取字符数组String.characters
  • unicode 表示的字符串长度aStr.characters.count,或者 aStr.endIndex
  • 插入字符insert(_:at:),比如:aStr.insert("!", at:aStr.endIndex)
  • 插入字符串insert(contentsOf:at:),比如:aStr.insert(contentsOf:"!!!", at: aStr.endIndex)
  • 删除字符串remove(at:),参数是 Range 类型

下一篇

Swift 个人学习笔记 - 05: 集合类型(Array, Set, Dictionary)

阅读 1.8k

后台 / 嵌入式全栈之路
曾经的嵌入式 / 后台开发一枚,现在开始走向架构。本专栏没有高深技术,只讲基础组件、工具,请放心食用

电子和互联网深耕多年,拥有丰富的嵌入式和服务器开发经验。现于负责腾讯云未来社区后台开发

798 声望
84 粉丝
0 条评论
你知道吗?

电子和互联网深耕多年,拥有丰富的嵌入式和服务器开发经验。现于负责腾讯云未来社区后台开发

798 声望
84 粉丝
宣传栏