《swift2.0 官方教程中文版》 第2章-03字符串和字符


import Foundation


/*字符串字面量************************************************/

let someString = "Some string literal value"




/*初始化空字符串************************************************/

var emptyString = "" // 空字符串字面量

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


if emptyString.isEmpty {

print("nothing to see here")

}

// 打印输出:"nothing to see here"




/*字符串可变性************************************************/

var variableString = "Horse"

variableString += " and carriage"

// variableString 现在为 "Horse and carriage"

let constantString = "Highlander"

//constantString += " and another Highlander"

// 这会报告一个编译错误 (compile-time error) - 常量字符串不可以被修改


//注意:

// Objective-C Cocoa ,您需要通过选择两个不同的类( Nsstring NSMutableString )来指定字符串 是否可以被修改




/*字符串是值类型************************************************/

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


//注意:

// Cocoa 中的 Nsstring 不同,当您在 Cocoa 中创建了一个 Nsstring 实例,并将其传递给一个函数/ ,或者赋值给一个变量,您传递或赋值的是该 Nsstring 实例的一个引用,除非您特别要求进行值拷贝,否则 字符串不会生成新的副本来进行赋值操作。

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




/*使用字符************************************************/

for character in "Dog!?".characters {

print(character)

}


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

let catCharacters: [Character] = ["C","a","t","!","?"]

let catString = String(catCharacters)

print(catString)

// 打印输出:"Cat!?"




/*连接字符串和字符************************************************/

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

let string1 = "hello"

let string2 = " there"

var welcome = string1 + string2

print(welcome)

// welcome 现在等于 "hello there"


//您也可以通过加法赋值运算符 ( += ) 一个字符串添加一个已经存在字符串变量上:

var instruction = "look over"

instruction += string2

print(instruction)

// instruction 现在等于 "look over there"


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

let exclamationMark: Character = "!"

welcome.append(exclamationMark)

print(welcome)

// welcome 现在等于 "hello there!"

//注意:

//您不能将一个字符串或者字符添加一个已经存在的字符变量上,因为字符变量只能包含一个字符




/*字符串插值************************************************/

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

let multiplier = 3

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

print(message)

// message is "3 times 2.5 is 7.5"




/*Unicode************************************************/

let mmm = "\u{1F425}"

print("mmm is \(mmm)")


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

//转义字符 \0 (空字符) \\ (反斜线) \t (水平制表符) \n (换行符) \r (回车符) \" (双引号) \' (单引 )

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


//下面的代码为各种特殊字符的使用示例。 wiseWords 常量包含了两个双引号。 dollarsign blackHeart s parklingHeart 常量演示了三种不同格式的 Unicode 标量:

let wiseWords = "\"Imagination is more important than kNowledge\" - Einstein" // "Imageination is more important than kNowledge" - Enistein

print("wiseWords is \(wiseWords)")

let dollarsign = "\u{24}" // $,Unicode 标量 U+0024

print("dollarsign is \(dollarsign)")

let blackHeart = "\u{2665}" // ?,Unicode 标量 U+2665

print("blackHeart is \(blackHeart)")

let sparklingHeart = "\u{1F496}" // ?,Unicode 标量 U+1F496

print("sparklingHeart is \(sparklingHeart)")


let eAcute: Character = "\u{E9}" // é

let combinedEAcute: Character = "\u{65}\u{301}" // e 后面加上 ?

print("eAcute is \(eAcute)")

print("combinedEAcute is \(combinedEAcute)")


let precomposed: Character = "\u{D55C}" // ?

let decomposed: Character = "\u{1112}\u{1161}\u{11AB}" // ?,?,?

print("precomposed is \(precomposed)")

print("decomposed is \(decomposed)")


let enclosedEAcute: Character = "\u{E9}\u{20DD}"

print("enclosedEAcute is \(enclosedEAcute)")


let regionalIndicatorForUS: Character = "\u{1F1FA}\u{1F1F8}"

print("regionalIndicatorForUS is \(regionalIndicatorForUS)")




/*计算字符数量************************************************/

let unusualMenagerie = "Koala ?,Snail ?,Penguin ?,Dromedary ?"

print("unusualMenagerie has \(unusualMenagerie.characters.count) characters")

// 打印输出 "unusualMenagerie has 40 characters"


var word = "cafe"

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

// 打印输出 "the number of characters in cafe is 4"


word += "\u{301}" // COMBINING ACUTE ACCENT,U+0301

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

// 打印输出 "the number of characters in café is 4"




/*访问和修改字符串************************************************/

//你可以通字符串的属性方法来访问和读取它,当然也可以用下标语法完成。

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


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

let aa = "indexes"

print("aa.startIndex is \(aa.startIndex)")

print("aa.endindex is \(aa.endindex)")


//通过调用 String.Index predecessor() 方法,可以立即得到前面一个索引,调用 successor() 方法可以立即 得到后面一个索引。任何一个 String 的索引都可以通过锁链作用的这些方法获取一个索引,也可以调用 ancedBy(_:) 方法获取。但如果尝试获取出界的字符串索引,就会抛出一个运行时错误

let greeting = "Guten Tag!"

greeting[greeting.startIndex]

// G

greeting[greeting.endindex.predecessor()]

// !

greeting[greeting.startIndex.successor()]

// u

let index = greeting.startIndex.advancedBy(7)

greeting[index]

// a


//greeting[greeting.endindex] // error

//greeting.endindex.successor() // error

for index in greeting.characters.indices {

print("\(greeting[index]) ",terminator: "")

}

// 打印输出 "G u t e n T a g !"


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

var welcome2 = "hello"

welcome2.insert("!",atIndex: welcome2.endindex)

print(welcome2)

// welcome Now 现在等于 "hello!"


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

welcome2.insertContentsOf(" there".characters,at: welcome2.endindex.predecessor())

print(welcome2)

// welcome 现在等于 "hello there!"


//调用 removeAtIndex(_:) 方法可以在一个字符串的指定索引删除一个字符。

welcome2.removeAtIndex(welcome2.endindex.predecessor())

print(welcome2)

// welcome 现在等于 "hello there"


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

let range = welcome2.endindex.advancedBy(-6)..<welcome2.endindex

welcome2.removeRange(range)

print(welcome2)

// welcome 现在等于 "hello"




/*比较字符串************************************************/

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

let quotation = "We're a lot alike,you and I."

let sameQuotation = "We're a lot alike,you and I."

if quotation == sameQuotation {

print("These two strings are considered equal")

}

// 打印输出 "These two strings are considered equal"


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

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"

]


var act1SceneCount = 0

for scene in romeoAndJuliet {

if scene.hasPrefix("Act 1") {

++act1SceneCount

}

}

print("There are \(act1SceneCount) scenes in Act 1")

// 打印输出 "There are 5 scenes in Act 1"


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

}

}

print("\(mansionCount) mansion scenes; \(cellCount) cell scenes")

// 打印输出 "6 mansion scenes; 2 cell scenes"




/*字符串的 Unicode 表示形式************************************************/

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...