Swift教程之字符串和字符详解

一个字符串String就是一个字符序列,像”hello,world”,”albatross”这样的。Swift中的字符串是用String关键词来定义的,同时它也是一些字符的集合,用Character定义。

Swift的String和Character类型为代码提供了一个快速的,兼容Unicode的字符解决方案。String类型的初始化和使用都是可读的,并且和C中的strings类似。同时String也可以通过使用+运算符来组合,使用字符串就像使用Swift中的其他基本类型一样简单。

1、字符串常量

在代码中可以使用由String预先定义的字符串常量,定义方式非常简单:

代码如下:

let someString = “Some string literal value”

字符串常量可以包括下面这些特殊字符:

空字符\0,反斜杠\,制表符\t,换行符\n,回车符\r,双引号\”和单引号\'

单字节Unicode字符,\xnn,其中nn是两个十六进制数

双字节Unicode字符,\unnnn,其中nnnn是四个十六进制数

四字节Unicode字符,\Unnnnnnnn,其中nnnnnnnn是八个十六进制数

下面的代码给出了这四种字符串的例子:

代码如下:

let wiseWords = "\"Imagination is more important than knowledge\" - Einstein"
// "Imagination is more important than knowledge" - Einstein
let dollarSign = "\x24" // $, Unicode scalar U+0024
let blackHeart = "\u2665" // ♥, Unicode scalar U+2665
let sparklingHeart = "\U0001F496" // , Unicode scalar U+1F496

2、初始化一个空串

初始化一个空串时有两种形式,但是两种初始化方法的结果都一样,表示空串

代码如下:

var emptyString = "" // empty string literal
var anotherEmptyString = String() // initializer syntax
// these two strings are both empty, and are equivalent to each other

通过isEmpty属性可以检查一个字符串是否为空

代码如下:

if emptyString.isEmpty {
println("Nothing to see here")
}
// prints "Nothing to see here"

3、变长字符串

如果使用var关键词定义的字符串即为可修改的变长字符串,而let关键词定义的字符串是常量字符串,不可修改。

代码如下:

var variableString = "Horse"
variableString += " and carriage"
// variableString is now "Horse and carriage"
let constantString = "Highlander"
constantString += " and another Highlander"
// this reports a compile-time error - a constant string cannot be modified

4、字符串不是指针,而是实际的值

在Swift中,一个String类型就是一个实际的值,当定义一个新的String,并且将之前的String值拷贝过来的时候,是实际创建了一个相等的新值,而不是仅仅像指针那样指向过去。

同样在函数传递参数的时候,也是传递的实际值,并且创建了一个新的字符串,后续的操作都不会改变原有的String字符串。

5、字符

Swift的字符串String就是由字符Character组成的,每一个Character都代表了一个特定的Unicode字符。通过for-in循环,可以遍历字符串中的每一个字符:

代码如下:

for character in "Dog!" {
println(character)
}
// D
// o
// g
// !
//

你也可以仅仅定义一个单独的字符:

代码如下:

let yenSign: Character = "¥"

6、字符计数

使用全局函数countElements可以计算一个字符串中字符的数量:

代码如下:

let unusualMenagerie = "Koala , Snail , Penguin , Dromedary "
println("unusualMenagerie has \(countElements(unusualMenagerie)) characters")
// prints "unusualMenagerie has 40 characters"

7、组合使用字符和字符串

String和Character类型可以通过使用+号相加来组合成一个新的字符串

代码如下:

let string1 = "hello"
let string2 = " there"
let character1: Character = "!"
let character2: Character = "?"
let stringPlusCharacter = string1 + character1 // equals "hello!"
let stringPlusString = string1 + string2 // equals "hello there"
let characterPlusString = character1 + string1 // equals "!hello"
let characterPlusCharacter = character1 + character2 // equals "!?"

也可以使用+=号来组合:

代码如下:

var instruction = "look over"
instruction += string2
// instruction now equals "look over there"
var welcome = "good morning"
welcome += character1
// welcome now equals "good morning!"

8、使用字符串生成新串

通过现有的字符串,可以使用如下方法来生成新的字符串:

代码如下:

let multiplier = 3
let message = "\(multiplier) times 2.5 is \(Double(multiplier) * 2.5)"
// message is "3 times 2.5 is 7.5"

在上面这个例子中,首先使用multiplier这个字符串3,来作为新串的一部分,用(multiplier)添加,同时上面的例子还用到了类型转换Double(multiplier),将计算结果和字符串本身都作为元素添加到了新的字符串中。

9、字符串比较

Swift提供三种方法比较字符串的值:字符串相等,前缀相等,和后缀相等
字符串相等
当两个字符串的包含完全相同的字符时,他们被判断为相等。

代码如下:

let quotation = "We're a lot alike, you and I."
let sameQuotation = "We're a lot alike, you and I."
if quotation == sameQuotation {
println("These two strings are considered equal")
}
// prints "These two strings are considered equal"
//输出”These two strings are considered equal”

前缀(prefix)相等和后缀(hasSuffix)相等

使用string 类的两个方法hasPrefix和hasSuffix,来检查一个字符串的前缀或者后缀是否包含另外一个字符串,它需要一个String类型型的参数以及返回一个布尔类型的值。两个方法都会在原始字符串和前缀字符串或者后缀字符串之间做字符与字符之间的。

下面一个例子中,用一个字符串数组再现了莎士比亚的罗密欧与朱丽叶前两幕的场景。

代码如下:

let romeoAndJuliet = [
"Act 1 Scene 1: Verona, A public place",
"Act 1 Scene 2: Capulet's mansion",
"Act 1 Scene 3: A room in Capulet's mansion",
"Act 1 Scene 4: A street outside Capulet's mansion",
"Act 1 Scene 5: The Great Hall in Capulet's mansion",
"Act 2 Scene 1: Outside Capulet's mansion",
"Act 2 Scene 2: Capulet's orchard",
"Act 2 Scene 3: Outside Friar Lawrence's cell",
"Act 2 Scene 4: A street in Verona",
"Act 2 Scene 5: Capulet's mansion",
"Act 2 Scene 6: Friar Lawrence's cell"
]

你可以使用hasPrefix 方法和romeoAndJuliet数组 计算出第一幕要表演多少个场景。

代码如下:

var act1SceneCount = 0
for scene in romeoAndJuliet {
if scene.hasPrefix("Act 1 ") {
++act1SceneCount
}
}
println("There are \(act1SceneCount) scenes in Act 1")
//输出”There are 5 scenes in Act 1”

同理,使用hasSuffix 方法去计算有多少个场景发生在Capulet公馆和Friar Lawrence牢房

代码如下:

var mansionCount = 0
var cellCount = 0
for scene in romeoAndJuliet {
if scene.hasSuffix("Capulet's mansion") {
++mansionCount
} else if scene.hasSuffix("Friar Lawrence's cell") {
++cellCount
}
}
println("\(mansionCount) mansion scenes; \(cellCount) cell scenes")
// 输出 "6 mansion scenes; 2 cell scenes”

大小写字符串

你可以从一个String类型的uppercaseString 和 lowercaseString中获得一个字符串的大写或小写。

代码如下:

let normal = "Could you help me, please?"
let shouty = normal.uppercaseString
// shouty is equal to "COULD YOU HELP ME, PLEASE?"
let whispered = normal.lowercaseString
// whispered is equal to "could you help me, please?"

10、Unicode

Unicode是编码和表示文本的国际标准。它几乎可以显示所有语言的所有字符的标准形态。还可以从类似于文本文件或者网页这样的外部源文件中读取和修改他们的字符。

Unicode术语

每一个Unicode字符都能被编码为一个或多个unicode scalar。一个unicode scalar是一个唯一的21位数(或者名称),对应着一个字符或者标识。例如 U+0061是一个小写的A (“a”), 或者U+1F425是一个面向我们的黄色小鸡

当一个Unicode字符串写入文本或者其他储存时,unicode scalar会根据Unicode定义的格式来编码。每一个格式化编码字符都是小的代码块,称成为code units.他包含UTF-8格式(每一个字符串由8位的code units组成)。和UTF-16格式(每一个字符串由16位的code units组成)

Unicode字符串

Swift 支持多种不同的方式取得Unicode字符串.
你可以使用for-in语句遍历字符串,来获得每一个字符的Unicode编码值。这个过程已经在字符(Working with Characters)描述过了。
或者,下面三个描述中使用合适的一个来获得一个字符串的值
UTF-8字符编码单元集合使用String类型的utf-8属性
UTF-16字符编码单元集合使用String类型的utf-16属性
21位Unicode标量集合使用String类型的unicodeScalars属性
下面的每一个例子展示了不同编码显示由 D , o , g , !

(DOG FACE, 或者Unicode标量 U+1F436)字符组成的字符串
UTF-8
你可以使用String类型的utf8属性遍历一个UTF-8编码的字符串。这个属性是UTF8View类型
,UTF8View是一个8位无符号整形(UInt8)的集合,集合中的每一个字节都是UTF-8编码。

代码如下:

for codeUnit in dogString.utf8 {
print("\(codeUnit) ")
}
print("\n")
// 68 111 103 33 240 159 144 182

在上面的例子中,前4个十进制codeunit值(68,111,103,33)显示为字符串 D , o ,g 和 ! ,和他们的ASCII编码相同一样。后面4个codeunit的值(240,159,144,182)是DOG FACE字符的4字节UTF-8编码。

UTF-16

你可以使用String类型的utf16属性遍历一个UTF-16编码的字符串。这个属性是UTF16View类型,UTF16View是一个16位无符号整形(UInt16)的集合,集合中的每一个字节都是UTF-16编码。

代码如下:

for codeUnit in dogString.utf16 {
print("\(codeUnit) ")
}
print("\n")
// 68 111 103 33 55357 56374

同理,前4个十进制codeunit值(68,111,103,33)显示为字符串 D , o ,g 和 ! ,他们的UTF-16 的codeunit和他们UTF-8的编码值相同。
第5和第6个codeunit值(55357和56374)是DOG FACE字符的UTF-16的代理对编码。他们的值是由值为U+D83D(十进制55357)的高位代理(lead surrogate)和值为U+DC36 (十进制56374)的低位代理(trail surrogate)组成。

Unicode标量

你可以使用String类型的unicodeScalars属性遍历一个Unicode标量编码的字符串。这个属性是UnicodeScalarsView类型,UnicodeScalarsView是一个UnicodeScalar类型的集合。每一个Unicode标量都是一个任意21位Unicode码位,没有高位代理,也没有低位代理。

每一个UnicodeScalar使用value属性,返回标量的21位值,每一位都是32位无符号整形(UInt32)的值:

代码如下:

for scalar in dogString.unicodeScalars {
print("\(scalar.value) ")
}
print("\n")
// 68 111 103 33 128054

value属性在前4个UnicodeScalar值(68,111,103,33)再一次展示编码了字符 D , o , g 和 ! 。第五个也是最后一个UnicodeScalar 是DOG FACE字符,十进制为128054,等价于16进制的1F436,相当于Unicode标量的U+1F436。
每一个UnicodeScalar可以被构造成一个新的字符串来代替读取他们的value属性,类似于插入字符串。

代码如下:

for scalar in dogString.unicodeScalars { println("\(scalar) ") }
// D
// o
// g
// !
//

(0)

相关推荐

  • swift 3.0中实现字符串截取、比较的方法示例

    前言 字符串处理一直都是程序开发中不可避免的,而字符串截取/替换操作更是频繁.swift3.0 中不能直接使用下标数字进行字符串解决,只能使用String.Index来做位置索引,要想实现截取功能首先得获取到String.Index; 下面话不多说了,来一起看看详细的介绍吧. 实例代码 下面两段代码获取开头可结尾,获取中间部分参数用Range<Index>即可: 获取结尾两个字符子串: let sessionId = "this is a test" let index =

  • swift 字符串String的使用方法

    swift 字符串String的使用方法 1.声明 var str = "Hello, playground" //var str: String = "Hello, playground" // 空字符串 let emptyString = "" let emptyString2 = String() // 使用String()初始化字符串 let str2 = String("Hello, swift") 2.判断字符串是

  • Swift教程之字符串和字符详解

    一个字符串String就是一个字符序列,像"hello,world","albatross"这样的.Swift中的字符串是用String关键词来定义的,同时它也是一些字符的集合,用Character定义. Swift的String和Character类型为代码提供了一个快速的,兼容Unicode的字符解决方案.String类型的初始化和使用都是可读的,并且和C中的strings类似.同时String也可以通过使用+运算符来组合,使用字符串就像使用Swift中的其他基

  • Golang基础教程之字符串string实例详解

    目录 1. string的定义 2.string不可变 3.使用string给另一个string赋值 4.string重新赋值 补充:字符串拼接 总结 1. string的定义 Golang中的string的定义在reflect包下的value.go中,定义如下: StringHeader 是字符串的运行时表示,其中包含了两个字段,分别是指向数据数组的指针和数组的长度. // StringHeader is the runtime representation of a string. // I

  • 正则表达式教程之匹配一组字符详解

    本文实例讲述了正则表达式教程之匹配一组字符的方法.分享给大家供大家参考,具体如下: 注:在所有例子中正则表达式匹配结果包含在源文本中的[和]之间,有的例子会使用Java来实现,如果是java本身正则表达式的用法,会在相应的地方说明.所有java例子都在JDK1.6.0_13下测试通过. 一.匹配多个字符中的某一个 在上一篇<正则表达式教程之匹配单个字符详解>中的一个匹配以na或sa开头的文本文件例子中,使用的正则表达式是.a.\.txt.如果还有一个文件是cal.txt,那么也将会被匹配到.如

  • 正则表达式教程之匹配单个字符详解

    本文实例讲述了正则表达式教程之匹配单个字符.分享给大家供大家参考,具体如下: 注:在所有例子中正则表达式匹配结果包含在源文本中的[和]之间,有的例子会使用Java来实现,如果是java本身正则表达式的用法,会在相应的地方说明.所有java例子都在JDK1.6.0_13下测试通过. java测试代码: /** * 根据正则表达式和要匹配的源文本,输出匹配结果 * @param regex 正则表达式 * @param sourceText 要匹配的源文本 */ public static void

  • java实现输出字符串中第一个出现不重复的字符详解

    java实现输出字符串中第一个出现不重复的字符详解 比如:输入name输出n,输入teeter输出r,输入namename输出null 具体实现代码如下: import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); String str = in.next(); for(int i =0 ; i < str.l

  • Go Java算法之字符串中第一个唯一字符详解

    目录 字符串中第一个唯一字符 方法一:哈希表(Java) 方法二:队列(Go) 字符串中第一个唯一字符 给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 .如果不存在,则返回 -1 . 示例 1: 输入: s = "leetcode" 输出: 0 示例 2: 输入: s = "loveleetcode" 输出: 2 示例 3: 输入: s = "aabb" 输出: -1 提示: 1 <= s.length <= 10

  • swift语言Codable 用法及原理详解

    目录 Codable Codable 的用法 JSON 和 模型的相互转换 解码(JSON Data -> Model): 编码(Model -> JSON Data): Codable 支持的数据类型 基础数据类型 Date 嵌套对象 枚举 自定义 CodingKeys Codable 的原理 Decodable 协议 Container 核心原理分析(Container <--> JSON) JSONDecoder 的解码过程 编译器帮我们做了什么? 默认值问题 属性包装器 @

  • Java之JSP教程九大内置对象详解(下篇)

    目录 前言 JSP pageContext对象 示例 JSP page对象 示例 JSP Cookie的使用 JSP 使用 cookie 主要分为以下几个步骤. 创建 cookie 对象 写入 cookie 设置 cookie 有效期 读取cookie 示例 读取cookie 删除cookie session和cookie的区别 前言 之前我们在这篇文章Java之JSP教程九大内置对象详解中,已经讲解完了六个个对象,接下来我们讲解最后的三个对象 JSP pageContext对象 pageCon

  • js-FCC算法-No repeats please字符串的全排列(详解)

    把一个字符串中的字符重新排列生成新的字符串,返回新生成的字符串里没有连续重复字符的字符串个数.连续重复只以单个字符为准 例如, aab 应该返回 2 因为它总共有6中排列 (aab, aab, aba, aba, baa, baa),但是只有两个 (aba and aba)没有连续重复的字符 (在本例中是 a). 从网上资料获得了一些思路,我的代码: function permAlone(str) { var arr=str.split(""); var perarr=[]; var

  • Python字符串处理实例详解

    Python字符串处理实例详解 一.拆分含有多种分隔符的字符串 1.如何拆分含有多种分隔符的字符串 问题: 我们要把某个字符串依据分隔符号拆分不同的字段,该字符串包含多种不同的分隔符,例如: s = "ab;cd|efg|hi,jkl|mn\topq;rst,uvw\txyz" 其中;,|,\t 都是分隔符号,如何处理? 方法一: 连续使用str.split()方法,每次处理一种分隔符号 s = "ab;cd|efg|hi,jkl|mn\topq;rst,uvw\txyz&q

随机推荐