Swift学习第二枪
上一次学习关于变量常量,数据类型,数据类型之间的转换,这次从字符串开始学习。 1.字符串字面量(String Literals)您可以在您的代码中包含一段预定义的字符串值作为字符串字面量。字符串字面量是由双引号 ( “” ) 包裹着的具有固定顺序的文本字符集。 字符串字面量可以用于为常量和变量提供初始值: let someString = "Some string literal value"
注意 someString 常量通过字符串字面量进行初始化,Swift 会推断该常量为 String 类型。 var emptyString = "" // 空字符串字面量
var anotherEmptyString = String() // 初始化方法
// 两个字符串均为空并等价。
您可以通过检查其 Boolean 类型的 isEmpty 属性来判断该字符串是否为空:
if emptyString.isEmpty {
print("Nothing to see here")
}
// 打印输出:"Nothing to see here"
2.字符串可变性 (String Mutability)可以通过将一个特定字符串分配给一个变量来对其进行修改,或者分配给一个常量来保证其不会被修改: var variableString = "Horse"
variableString += " and carriage"
// variableString 现在为 "Horse and carriage"
let constantString = "Highlander"
constantString += " and another Highlander"
// 这会报告一个编译错误 (compile-time error) - 常量字符串不可以被修改。
注意: 3.字符串是值类型(Strings Are Value Types)Swift 的 String 类型是值类型。 如果您创建了一个新的字符串,那么当其进行常量、变量赋值操作,或在函数/方法中传递时,会进行值拷贝。 任何情况下,都会对已有字符串值创建新副本,并对该新副本进行传递或赋值操作。 4.使用字符(Working with Characters)您可通过 for-in 循环来遍历字符串中的 characters 属性来获取每一个字符的值: for character in "Dog!?".characters {
print(character)
} // D // o // g // ! // ?
for-in 循环在 For Loops (页 0) 中进行了详细描述。 let exclamationMark: Character = "!"
字符串可以通过传递一个值类型为 Character 的数组作为自变量来初始化: let catCharacters: [Character] = ["C","a","t","!","?"]
let catString = String(catCharacters)
print(catString)
// 打印输出:"Cat!?"
5.连接字符串和字符 (Concatenating Strings and Characters)字符串可以通过加法运算符( + )相加在一起(或称“连接”)创建一个新的字符串: let string1 = "hello"
let string2 = " there"
var welcome = string1 + string2
// welcome 现在等于 "hello there"
您也可以通过加法赋值运算符 ( += ) 将一个字符串添加到一个已经存在字符串变量上: var instruction = "look over" instruction += string2 // instruction 现在等于 "look over there" 您可以用 append() 方法将一个字符附加到一个字符串变量的尾部: let exclamationMark: Character = "!" welcome.append(exclamationMark) // welcome 现在等于 "hello there!" 注意: 您不能将一个字符串或者字符添加到一个已经存在的字符变量上,因为字符变量只能包含一个字符。 6.字符串插值 (String Interpolation)字符串插值是一种构建新字符串的方式,可以在其中包含常量、变量、字面量和表达式。 您插入的字符串字面量 let multiplier = 3 let message = "(multiplier) times 2.5 is (Double(multiplier) * 2.5)" // message is "3 times 2.5 is 7.5" 在上面的例子中, multiplier 作为 (multiplier) 被插入到一个字符串常量量中。 当创建字符串执行插值计算时此占位符会被替换multiplier 实际的值。multiplier 的值也作为字符串中后面表达式的一部分。 该表达式计算 Double(multiplier) * 2.5 的值并将结果( 7.5 ) 插入到字符串中。 在这个例子中,表达式写为 (Double(multiplier) * 2.5) 并包含在字符串字面量中。 注意: 7.UnicodeUnicode 是一个国际标准,用于文本的编码和表示。 它使您可以用标准格式表示来自任意语言几乎所有的字符,并能够对文本文件或网页这样的外部资源中的字符进行读写操作。 Swift 的 String 和 Character 类型是完 7.1Unicode 标量(Unicode Scalars)Swift 的 String 类型是基于 Unicode 标量 建立的。 Unicode 标量是对应字符或者修饰符的唯一的21位数字,例如 U+0061 表示小写的拉丁字母( LATIN SMALL LETTER A )(” a “), U+1F425 表示小鸡表( FRON **注意: **Unicode 码位(code poing) 的范围是 U+0000 到 U+D7FF 或者 U+E000 到 U+10FFFF 。Unicode **字符串字面量可以包含以下特殊字符: ? 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}" // ?,Unicode 标量 U+1F496 8.计算字符数量 (Counting Characters)如果想要获得一个字符串中 Character 值的数量,可以使用字符串的 characters 属性的 count 属性: let unusualMenagerie = "Koala ?,Snail ?,Penguin ?,Dromedary ?" print("unusualMenagerie has (unusualMenagerie.characters.count) characters") // 打印输出 "unusualMenagerie has 40 characters" 注意在 Swift 中,使用可拓展的字符群集作为 Character 值来连接或改变字符串时,并不一定会更改字符串的字 例如,如果你用四个字符的单词 cafe 初始化一个新的字符串,然后添加一个 COMBINING ACTUE ACCEN 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" 注意: 9 访问和修改字符串 (Accessing and Modifying a String)你可以通字符串的属性和方法来访问和读取它,当然也可以用下标语法完成。 9.1字符串索引 (String Indices)每一个 String 值都有一个关联的索引( index )类型String.Index ,它对应着字符串中的每一个 Character 的位置。 使用 startIndex 属性可以获取一个 String 的第一个 Character 的索引。使用 endIndex 属性可以获取最后一个Character 的后一个位置的索引。因此, endIndex 属性不能作为一个字符串的有效下标。如果 String 是空串, startIndex 和 endIndex 是相等的。 通过调用 String.Index 的 predecessor() 方法,可以立即得到前面一个索引,调用 successor() 方法可以立即得到后面一个索引。任何一个 String 的索引都可以通过锁链作用的这些方法来获取另一个索引,也可以调用 advancedBy(_:) 方法来获取。但如果尝试获取出界的字符串索引,就会抛出一个运行时错误。 你可以使用下标语法来访问 String 特定索引的 Character 。 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 试图获取越界索引对应的 Character ,将引发一个运行时错误。 greeting[greeting.endIndex] // error greeting.endIndex.successor() // error 使用 characters 属性的 indices 属性会创建一个包含全部索引的范围( Range ),用来在一个字符串中访问单个字符。 for index in greeting.characters.indices { print("(greeting[index]) ",terminator: "") } // 打印输出 "G u t e n T a g !" 9.2插入和删除 (Inserting and Removing)调用 insert(_:atIndex:) 方法可以在一个字符串的指定索引插入一个字符。 var welcome = "hello" welcome.insert("!",atIndex: welcome.endIndex) // welcome now 现在等于 "hello!" 调用 insertContentsOf(_:at:) 方法可以在一个字符串的指定索引插入一个字符串。 welcome.insertContentsOf(" there".characters,at: welcome.endIndex.predecessor()) // welcome 现在等于 "hello there!" 调用 removeAtIndex(_:) 方法可以在一个字符串的指定索引删除一个字符。 welcome.removeAtIndex(welcome.endIndex.predecessor()) // welcome 现在等于 "hello there" 调用 removeRange(_:) 方法可以在一个字符串的指定索引删除一个子字符串。 let range = welcome.endIndex.advancedBy(-6)..<welcome.endIndex welcome.removeRange(range) // welcome 现在等于 "hello" 10 比较字符串 (Comparing Strings)Swift 提供了三种方式来比较文本值:字符串字符相等、前缀相等和后缀相等。 10.1 字符串/字符相等 (String and Character Equality)字符串/字符可以用等于操作符( == )和不等于操作符( != ) 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" 10.2 前缀/后缀相等 (Prefix and Suffix Equality)通过调用字符串的 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" ] 您可以调用 hasPrefix(_:) 方法来计算话剧中第一幕的场景数: 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" 相似地,您可以用 hasSuffix(_:) 方法来计算发生在不同地方的场景数: 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 字符串基本就这些操作了。 下面是我的一个学习Swift开源库。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- c# – 如何通过传递数据库名称访问WPF中的SQL Server数据库
- Oracle SQL Union / Merge with Duplicates问题
- Cocos2d-x 3.0截屏功能集成
- Kingbase和PostgreSQL中如何查看当前连接的进程信息
- FlashBuilder生成ASDOC文档
- 用ACE_Reactor实现类似计时器的装置收藏
- (Ryan的Koa系列博客)4.依赖库:events概述
- oracle – PL / SQL中是否有MD5 Sum函数
- c – 使用Google Mocks,如何在不关心/设置任何调用期望的情
- oracle – 如何使用Distinct从表中仅选择一个唯一记录