Swift3-字符串合字符

Posted cjj-ggboy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swift3-字符串合字符相关的知识,希望对你有一定的参考价值。

字符串字面量、初始化空字符串、字符串可变性、字符串是值类型、使用字符、连接字符串合字符、字符串插值、Unicode、计算字符数量、访问和修改字符串、比较字符串、字符串的Unicode表示形式。

 

Swift字符串类型String,字符类型Character。字符串和字符的字面值都是以双引号括起来。var a:Character="a"  //

 字符串连接操作只需要简单地通过+符号相连即可。

 

String每一个字符都是由编码无关的Unicode字符组成,并支持访问字符的多种Unicode表示形式。

 

字符串字面量:

字符串字面量是由双引号(“”)包裹着的具有固定顺序的文本字符集。字符串字面量可以用于为常量提供初始值。

 

初始化空字符串:

要创建一个空字符串作为初始值,可以将空的字符串字面量赋值给变量,也可以初始化一个新的String实例:

var a=""

var b=String()

可以通过字符串的isEmpty属性来判断该字符串是否为空:

if a.isEmpty{...}

 

字符串可变性:

可以通过将一个特定字符串分配给一个变量对其进行修改,或者分配给一个常量来保证其不会被修改。

 

字符串是值类型:

Swift的String类型是值类型,如果创建了一个新的字符串,那么当其进行常量、变量赋值操作,或在函数/方法中传递时,会进行值拷贝。任何情况下,都会对已有字符串值创建新副本,并对该新副本进行传递或赋值操作。

Swift默认字符串拷贝的方式保证了在函数/方法中传递的是字符串的值。

在实际编译时,Swift编译器会优化字符串的使用,使实际的复制只会发生在绝对必要的情况下,这意味着将字符串作为值类型的同时可以获得极高的性能。

 

使用字符:

可以通过for-in循环来遍历字符串中的characters属性来获取每一个字符的值。

for i in "cjj".characters{...}  //这里的characters属性在Swift5中已过时。

可直接:for i in "cjj"{...}  //直接for-in字符串获取每个字符。

另外,通过标明一个Character类型并用字符字面量进行赋值,可以建立一个独立的字符常量或变量。

let a:Character="c"

字符串可以通过传递一个值类型为Character的数组作为自变量来初始化。

var a=["c","j","j"];var b=String(a)  //强制将字符数组转换为字符串

 

连接字符串和字符:

字符串可以通过加法运算符(+)相加在一起(或称“连接”)创建一个新的字符串。

var a="cjj"+"xyy"

也可以用加法赋值运算符(+=)将一个字符串添加到一个已经存在字符串变量上。

可以用append()方法将一个字符附加到一个字符串变量的尾部:

a.append(Character("c"))

 

字符串插值:

字符串插值是一种构建新字符串的方式,可以在其中包含常量、变量、字面量和表达式。插入的字符串字面量的每一项都在以反斜线为前缀的圆括号中。

var a:String="(b)"

 

Unicode:

Unicode是一个国际标准,用于文本的编码和表示。它使可以用标准格式表示来自任意语言几乎所有的字符,并能够对文本文件或网页这样的外部资源中的字符进行读写操作。Swift的String和Character类型是完全兼容Unicode标准的。

 

Unicode标量:

Swift的String类型是基于Unicode标量建立的。Unicode标量是对应字符或者修饰符的唯一的21位数字。例如U+0061表示小写的拉丁字母(“a”)。

Unicode的码位(code point)的范围是U+0000到U+D7FF或者U+E000到U+10FFFF。Unicode标量不包括Unicode代理项码位,其码位范围是U+D800到U+DFFF。

 

字符串字面量的特殊字符:

字符串字面量可以包含以下特殊字符:

转义字符(空字符)、\(反斜杠)、 (水平制表符)、 (换行符)、 (回车符)、"(双引号)、‘(单引号)。

Unicode标量,写成u{n}(u为小写),其中n为任意一到八位十六进制数且可用的Unicode位码。

let a="u{61}"  //这表示小写a字符

 

可扩展的字形群集:

每一个Swift的Character类型代表一个可扩展的字形群。一个可扩展的字形群是一个或多个可生成人类可读的字符Unicode标量的有序排列。

举个例子,字母é可以用单一的Unicode标量é(U+00E9)表示。然而一个标准的字母e(U+0065)加上一个急促重音的(U+0301)的标量,这样一对标量就表示了同样的字母é。

在这两种情况中,字母é代表了一个单一的Swift的Character值,同时代表了一个可扩展的字形群。在第一种情况,这个字形群包含一个单一标量;而在第二种情况,它是包含两个标量的字形群。

可扩展的字符群集是一个灵活的方法,用许多复杂的脚本字符表示单一的Character值。

可扩展的字符群集可以使包围记号的标量包围其它Unicode标量,作为一个单一的Character值。

地域性指示符号的Unicode标量可以组合成一个单一的Character值。

 

计算字符数量:

如果想要获得一个字符串中Character值的数量,可以使用字符串的count属性。

print("cjj".count)

注意:可扩展的字符群集可以组成一个或者多个Unicode标量。这意味着不同的字符以及相同字符的不同表示方式可能需要不同数量的内存空间来存储。

 

访问和修改字符串:

可以通过字符串的属性和方法来访问和修改它,当然也可以用下标语法完成。

字符串索引:

每一个String值都有一个关联的索引(index)类型,String.Index,它对应着字符串中的每一个Character的位置。

前面提到,不同的字符可能会占用不同数量的内存空间,所以要知道Character的确定位置,就必须从String开头遍历每一个Unicode标量直到结尾。因此,Swift的字符串不能用整数做索引。

使用startIndex属性可以获取一个String的第一个Character的索引。使用endIndex属性可以获取最后一个Character的后一个位置的索引。因此,endIndex属性不能作为一个字符串的有效下标。如果String是空串,startIndex和endIndex是相等的。

通过调用String的index(before:)或index(after:)方法,可以立即得到前面或后面的一个索引。还可以通过调用index(_:offsetBy:)方法来获取对应偏移量的索引,这种方式可以避免多次调用index(before:)或index(after:)方法。

试图获取越界索引对应的Character,将引发一个运行时错误。

使用字符串的indices属性可创建一个包含全部索引的范围,用来在一个字符串中访问单个字符:

var a="abcdef"

for i in a.indices{

  print(a[i])

}

可以在任何一个确认并遵循Collection协议的类型里面,都可以使用startIndex和endIndex属性或者index(before:)、index(after:)和index(_:,offsetBy:)方法。如String、Array、Dictionary和Set中。

 

插入和删除:

调用insert(_:, at:)方法可以在一个字符串的指定索引插入一个字符,调用insert(contentsOf:, at:)方法可以在一个字符串的指定索引插入一个段字符串。

insert第一个参数指定插入的字符,at指定插入的位置。如at:a.startIndex在字符串开头的前面插入。

调用remove(at:)方法可以在一个字符串的指定索引删除一个字符,调用removeSubrange(_:)方法可以在一个字符串的指定索引删除一个子字符串。

remove的at指定删除字符的位置,如at:a.startIndex删除第一个字符。

removeSubrange(_:)用法:

let range=a.index(a.endIndex,offsetBy:-6)..<a.endIndex

a.removeSubrange(range)

 

比较字符串:

Swift提供三种方式比较文本值:字符串字符相等,前缀相等和后缀相等。

字符串/字符相等:

字符串/字符可以用等于操作符(==)和不等于操作符(!=)

字符串/字符相等是指语义相等,它们的Unicode标量构成可不同。

 

前缀/后缀相等:

通过调用字符串的hasPrefix(_:) / hasSuffix(_:) 方法来检查字符串是否拥有特定前缀/后缀。两个方法均接收一个String类型的参数,并返回一个布尔值。

var a="cjj is not xyy"

if a.hasPrefix("cjj"){...}

if a.hasSuffix("xyy"){...}

 

字符串的Unicode表示形式:

字符串中的Unicode标量会用Unicode定义的几种编码格式编码。每一个字符串中的小块编码都被称代码单元。这些包括UTF-8编码格式(编码字符串为8位的代码单元),UTF-16编码格式(编码字符串为16位的代码单元),以及UTF-32编码格式(编码字符串32位的代码单元)

三种以Unicode兼容的方式访问字符串的值:

1)UTF-8代码单元集合(利用字符串的utf8属性进行访问

2)UTF-16代码单元集合(利用字符串的utf16属性进行访问

3)21位的Unicode标量值集合,也就是字符串的UTF-32编码格式(利用字符串的unicodeScalars属性进行访问)

for i in a.utf8{

  print(i.value)

}  

//a.utf16 / a.unicodeScalars

 

以上是关于Swift3-字符串合字符的主要内容,如果未能解决你的问题,请参考以下文章

Swift3.0语言教程获取字符串编码与哈希地址

Swift3.0语言教程比较判断字符串

Swift3.0语言教程获取C字符串

如何在swift3中获取子字符串的范围? [复制]

Swift3.0 字符串常用整理

Swift3.0语言教程使用指针创建和初始化字符串