内容字号:默认大号超大号

段落设置:段首缩进取消段首缩进

字体设置:切换到微软雅黑切换到宋体

Swift--字符串和字符

2018-06-08 18:47 出处:清屏网 人气: 评论(0

文章摘要

  • 1、字符串字面量
  • 2、多行字符串字面量
  • 3、字符串字面量的特殊字符 转义字符 Unicode 标量 "\u{24}"
  • 4、初始化空字符串
  • 5、字符串可变性
  • 6、使用字符
  • 7、连接字符串和字符
  • 8、字符串插值
  • 9、Unicode
  • 10、计算字符数量
  • 11、访问和修改字符串
    字符串索引
    插入和删除
    子字符串
    比较字符串
    前后缀相等
  • 12、字符串的Unicode 表示形式

注意点

1、三个双引号 """ :可换行、可包含"、可以用在行尾写一个反斜杠()作为续行符

2、字符串是值类型

字符串字面量

由一对双引号包裹着的具有固定顺序的字符集。

字符串字面量可以用于为常量和变量提供初始值:

let someString = "Some string literal value"

多行字符串字面量

由一对三个双引号包裹着的具有固定顺序的文本字符集:

let quotation = """
The White Rabbit put on his spectacles.  "Where shall I begin,
please your Majesty?" he asked.

"Begin at the beginning," the King said gravely, "and go on
till you come to the end; then stop."
"""

//两个字符串其实是一样的
let singleLineString = "These are the same."
let multilineString = """
These are the same.
"""

//可以用在行尾写一个反斜杠(\)作为续行符。
let softWrappedQuotation = """
The White Rabbit put on his spectacles.  "Where shall I begin, \
please your Majesty?" he asked.

"Begin at the beginning," the King said gravely, "and go on \
till you come to the end; then stop."
"""

//让一个多行字符串字面量开始和结束于换行符,请将换行写在第一行和最后一行
let lineBreaks = """

This string starts with a line break.
It also ends with a line break.

"""

字符串字面量的特殊字符

  • 转义字符\0(空字符)、\(反斜线)、\t(水平制表符)、\n(换行符)、\r(回车符)、"(双引号)、'(单引号)。
  • Unicode 标量,写成\u{n}(u为小写),其中n为任意一到八位十六进制数且可用的 Unicode 位码。
let wiseWords = "\"Imagination is more important than knowledge\" - Einstein"
// "Imageination is more important than knowledge" - Enistein
let dollarSign = "\u{24}"             // $, Unicode 标量 U+0024
let blackHeart = "\u{2665}"           // ♥, Unicode 标量 U+2665
let sparklingHeart = "\u{1F496}"      // :sparkling_heart:, Unicode 标量 U+1F496

//要在多行字符串字面量中使用 """ 的话,就需要使用至少一个转义符(\):
let threeDoubleQuotes = """
Escaping the first quote \"""
Escaping all three quotes \"\"\"
"""

初始化空字符串

var emptyString = ""//空字符串字面量
 var anotherEmptyString = String()//初始化方法
// 两个字符串均为空并等价

通过检查其Bool类型的isEmpty属性来判断该字符串是否为空:

if emptyString.isEmpty {
   print("Nothing to see here")
 }

字符串可变性

var variableString = "Horse"
 variableString += " and carriage"
// variableString 现在为 "Horse and carriage"
 
 let constantString = "Highlander"
 //constantString += " and another Highlander"//let 不可修改

字符串是值类型

Swift 的String类型是值类型。 如果您创建了一个新的字符串,那么当其进行常量、变量赋值操作,或在函数/方法中传递时,会进行值拷贝。

使用字符

//获取字符串中每一个字符的值
 for character in "Dog!:dog:".characters {
   print(character)
 }

//建立一个独立的字符常量或变量
 let exclamationMark: Character = "!"

//字符串可以通过传递一个值类型为Character的数组作为自变量来初始化:
 let catCharacters:[Character] = ["C","a","t","!",":cat:"]
 let catString = String(catCharacters)
 print(catString)

连接字符串和字符

//字符串可以通过加法运算符(+)相加在一起(或称“连接”)创建一个新的字符串:
 let string1 = "Hello"
 let string2 = " there"
 var welcome = string1 + string2
 
//可以通过加法赋值运算符 (+=) 将一个字符串添加到一个已经存在字符串变量上:
 var instruction = "look over"
 instruction += string2

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

//如果你需要使用多行字符串字面量来拼接字符串,并且你需要字符串每一行都以换行符结尾,包括最后一行:
let badStart = """
one
two
"""
let end = """
three
"""
print(badStart + end)
// 打印两行:
// one
// twothree

let goodStart = """
one
two

"""
print(goodStart + end)
// 打印三行:
// one
// two
// three

字符串插值

可以在其中包含常量、变量、字面量和表达式。

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

插值字符串中写在括号中的表达式不能包含非转义反斜杠 (),并且不能包含回车或换行符。不过,插值字符串可以包含其他字面量。

Unicode

Unicode是一个国际标准,用于文本的编码和表示。

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

Unicode 标量

Swift 的String类型是基于 Unicode 标量 建立的。 Unicode 标量是对应字符或者修饰符的唯一的21位数字,例如U+0061表示小写的拉丁字母(LATIN SMALL LETTER A)("a"),U+1F425表示小鸡表情(FRONT-FACING BABY CHICK) (":hatched_chick:")。

可扩展的字形群集

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

let eAcut: Character = "\u{E9}"//é Unicode
let combinedEAcute: Character = "\u{65}\u{301}"//e 后面加上急促重音

let precomposed: Character = "\u{D55C}"// 한
let decomposed:Character = "\u{1112}\u{1161}\u{11AB}" // ᄒ, ᅡ, ᆫ

let enclosedEAcute: Character = "\u{E9}\u{20DD}" // é⃝
let regionalIndicatorForUS: Character = "\u{1F1FA}\u{1F1F8}"// :us:

计算字符数量

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

let unusualMenagerier =  "Koala :koala:, Snail :snail:, Penguin :penguin:, Dromedary :dromedary_camel:"
 print("unusualMenagerier has \(unusualMenagerier.characters.count) characers")

 var word = "cafe"
 print("the number of characters in \(word) is \(word.characters.count)")

 word += "\u{301}"

 print("the number of characters in \(word) is \(word.characters.count)")

访问和修改字符串

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

字符串索引

  • 每一个String值都有一个关联的索引(index)类型,String.Index,它对应着字符串中的每一个Character的位置。
  • 不同的字符可能会占用不同数量的内存空间,所以要知道Character的确定位置,就必须从String开头遍历每一个 Unicode 标量直到结尾。因此,Swift 的字符串不能用整数(integer)做索引。
  • 使用startIndex属性可以获取一个String的第一个Character的索引。使用endIndex属性可以获取最后一个Character的后一个位置的索引。
  • 通过调用 String 的 index(before:) 或 index(after:) 方法,可以立即得到前面或后面的一个索引。您还可以通过调用 index(_:offsetBy:) 方法来获取对应偏移量的索引,这种方式可以避免多次调用 index(before:) 或 index(after:) 方法。
let greeting = "Guten Tag!"
 greeting[greeting.startIndex]
 greeting[greeting.index(before: greeting.endIndex)]
 greeting[greeting.index(after: greeting.startIndex)]
 let index = greeting.index(greeting.startIndex, offsetBy:7)
 greeting[index]
 //greeting[greeting.endIndex] //error
 //greeting.index(after: endIndex) //error

 //使用 indices 属性会创建一个包含全部索引的范围(Range),用来在一个字符串中访问单个字符
 for index in greeting.characters.indices {
 print("\(greeting[index]) ", terminator:"")
 }

插入和删除

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

var welcome1 = "hello"
 welcome1.insert("!", at: welcome1.endIndex)
 welcome1.insert(contentsOf: " there".characters, at: welcome1.index(before:welcome1.endIndex))

 welcome1.remove(at: welcome1.index(before:welcome1.endIndex))
 let range = welcome1.index(welcome1.endIndex, offsetBy:-6)..<welcome1.endIndex
 welcome1.removeSubrange(range)

子字符串

当你从字符串中获取一个子字符串

Swift 里的 SubString 绝大部分函数都跟 String 一样,意味着你可以使用同样的方式去操作 SubString 和 String。然而,跟 String 不同的是,你只有在短时间内需要操作字符串时,才会使用 SubString。当你需要长时间保存结果时,就把 SubString 转化为 String 的实例:

let greeting = "Hello, world!"
let index = greeting.index(of: ",") ?? greeting.endIndex
let beginning = greeting[..<index]
// beginning 的值为 "Hello"

// 把结果转化为 String 以便长期存储。
let newString = String(beginning)

比较字符串

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

//字符串/字符相等
 let quotation = "We're a lot alike, you and I."
 let sameQuotation = "We're a lot alike, you and I."
 if quotation == sameQuotation {
 print("There two strings are considered equal")
 }

//只要它们有同样的语言意义和外观,就认为它们标准相等

// "Voulez-vous un café?" 使用 LATIN SMALL LETTER E WITH ACUTE
 let eAcuteQuestion = "Voulez-vous un caf\u{E9}?"
 
 // "Voulez-vous un café?" 使用 LATIN SMALL LETTER E and COMBINING ACUTE ACCENT
 let combinedEAcuteQuestion = "Voulez-vous un caf\u{65}\u{301}?"
 
 if eAcuteQuestion == combinedEAcuteQuestion {
 print("These two strings are considered equal")
 }

//两个字符看着是一样的,但却有不同的语言意义

let latinCapitalLetterA: Character = "\u{41}"
 
 let cyrillicCapitalLetterA: Character = "\u{0410}"
 
 if latinCapitalLetterA != cyrillicCapitalLetterA {
 print("These two characters are not equivalent")
 }

前后缀相等

通过调用字符串的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(_:)
 var act1SceneCount = 0
 for scene in romeoAndJuliet {
 if scene.hasPrefix("Act 1 ") {
 act1SceneCount += 1
 }
 }
 print("There are \(act1SceneCount) scenes in Act 1")

 //hasSuffix(_:)
 var mansionCount = 0
 var cellCount = 0
 for scene in romeoAndJuliet {
 if scene.hasSuffix("Capulet's mansion") {
 mansionCount += 1
 }
 else if scene.hasSuffix("Friar Lawrence's cell") {
 cellCount += 1
 }
 }
 print("\(mansionCount) mansion scenes; \(cellCount) cell scenes")

字符串的Unicode 表示形式

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

  • UTF-8 代码单元集合 (利用字符串的utf8属性进行访问)
  • UTF-16 代码单元集合 (利用字符串的utf16属性进行访问)
  • 21位的 Unicode 标量值集合,也就是字符串的 UTF-32 编码格式 (利用字符串的unicodeScalars属性进行访问)

下面由D,o,g,‼(DOUBLE EXCLAMATION MARK, Unicode 标量 U+203C)和:dog:(DOG FACE,Unicode 标量为U+1F436)组成的字符串中的每一个字符代表着一种不同的表示:

let dogString = "Dog!!:dog:"

UTF-8 表示

您可以通过遍历String的utf8属性来访问它的UTF-8表示。 其为String.UTF8View类型的属性,UTF8View是无符号8位 (UInt8) 值的集合,每一个UInt8值都是一个字符的 UTF-8 表示:

for codeUnit in dogString.utf8 {
 print("\(codeUnit) ", terminator: "")
 }
 print("")

UTF-16 表示

通过遍历String的utf16属性来访问它的UTF-16表示。 其为String.UTF16View类型的属性,UTF16View是无符号16位 (UInt16) 值的集合,每一个UInt16都是一个字符的 UTF-16 表示:

for codeUnit in dogString.utf16 {
 print("\(codeUnit) ", terminator: "")
 }
 print("")

Unicode 标量表示

通过遍历String值的unicodeScalars属性来访问它的 Unicode 标量表示。 其为UnicodeScalarView类型的属性,UnicodeScalarView是UnicodeScalar类型的值的集合。 UnicodeScalar是21位的 Unicode 代码点。

for scalar in dogString.unicodeScalars {
 print("\(scalar.value)", terminator: "")
 print("\(scalar)")
 }
 print("")
分享给小伙伴们:
本文标签: Swift字符串

相关文章

发表评论愿您的每句评论,都能给大家的生活添色彩,带来共鸣,带来思索,带来快乐。

CopyRight © 2015-2016 QingPingShan.com , All Rights Reserved.

清屏网 版权所有 豫ICP备15026204号