Swift Up and Running——字符、Unicode和字符串

高清教学视频

Swift里,我们使用String来表示字符串类型,它是一个Character类型的集合。在开始具体的编码之前,我们先来了解一些关于字符编码的知识。

字符编码就是把各种字符按照一定标准,转换成计算机可以识别的数字的过程。例如,在我们熟悉的ASCII编码中:

字符 ASCII编码
A 0x61
$ 0x24

除了ASCII编码外,还有很多处理其它语言文字的编码。在维基百科我们可以看到,即便是“常用的字符编码”,就有图中显示的那么多种:

其中,有处理中文的GBK/GB2312,有处理西欧文字的ISO8859,有处理日文的JIS X。这些编码方式,可以帮助计算机方便的工作在双语言环境里。但是,却不能帮助我们的计算机解决多语言环境工作的问题。我们用汉字“泊”来举个例子:

汉字 编码集 编码值
GBK 0xB2B4
BIG5 0xAA79
GB2312 0xB2B03
JIS X 0x4777

可以看到,同一个汉字“泊”,在不同的字符集里的编码值是不一样的。这使得计算机在多语言环境里,处理文本变得非常复杂。因此,国际上开始推行一种叫做Unicode的标准,它使用统一的编码规则对几乎我们使用的所有文字、字符和符号进行了统一编码。而Swift中的String对象,就是完全基于Unicode构建的。


String的初始化

我们可以像下面这样,初始化一个空的字符串:


//: #### String init

let emptyString = ""
let emptyString1 = String()

也可以使用type inference给字符串赋值:


//: #### String init

var swift = "Swift is fun."

“在Swift里,String对象是否允许被修改,只取决于我们使用letvar来定义。而不像Objective-C中,需要我们使用NSString和NSMutableString来分别定义。”

特别提示

String是一个value type

Objective-C不同,Swift中的String是一个值类型,当我们把一个String对象赋值给其它变量的时候,Swift会完整复制字符串的内容,而不仅仅是复制一个指向原有字符串的引用。


var swift = "Swift is fun."

// String - value type
let swiftCopy = swift // Copy on write
print(swift)

当然,Swift对字符串的拷贝操作进行了优化,我们只有在后面的代码真正修改字符串的时候,拷贝操作才真的发生。


String中的字符: Character

String中的每一个字符都是一个Character对象,我们可以这样单独定义它们:


//: Character

let charA: Character = "A"
let charB = "B"

我们可以访问String对象的characters属性来遍历字符串中的每一个字符:


//: Character

for char in swift.characters {
    print(char)
}

我们还可以使用一个Character数组来初始化一个String对象:


let swiftInChar: [Character] = ["S", "w", "i", "f", "t"]
let swift1 = String(swiftInChar)

除此之外 ,String对象还支持通过+直接进行拼接,生成新的String对象:


let swift2 = swift + swift1

String interpolation

我们可以通过在字符串中插入\(expression),把expression的值直接插入字符串。在Swift里,这就叫做string interpolation,来看个例子:


//: String interpolation

// \(expression)

let PI = 3.14
var message = "PI equals to \(PI)"
message = "PI * 100 equals to \(PI * 100)"

// \ CR LF

使用string interpolation有一些限制,我们不能够在String中插入回车和换行。以上,就是全部和字符串初始化有关的内容,在进一步了解String的各种操作之前,我们要先补充一些Unicode知识。


Unicode

Unicode Scalar

Unicode使用一个21-bit的整数,几乎对我们使用的所有字符采用统一的格式进行了编码,像这样:

从图中我们就可以看到,不同的字符集合在Unicode中占用了不同的取值范围。访问 http://unicode-table.com/en/ 点击其中一个字符,就可以查看详细信息了:

在上图中,我们可以看到,字符B有一个名字"Latin Capital Letter B",还有一个unicode number: U+4402。事实上,每个unicode字符都会有一个对应的name和number,我们管这个number,就叫做unicode scalar

“并不是21-bit所有整数空间都被分配了字符,unicode scalar并不包含U+D800-U+DFFF之间的值,它们叫做unicode surrogate pair code points。“

特别提示

Swift里,我们可以这样:

\u{unicode scalar}

来使用unicode scalar。


// Unicode Scalar

let blingHeart = "\u{1F496}"
blingHeart.dynamicType

从图中的结果,我们就可以看到,blingHeart是一个String,值是

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值