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 表示形式************************************************/
原文链接:https://www.f2er.com/swift/325348.html