ch03字符串和字符--Strings and Characters

ch02基本的运算符


//字符串是一串字符,swift里的字符串是String类型

//字符串级联用+操作符将两个字符串关联起来

3.0字符串--String Literals

//用""声明一个字符串
let someString = "Some string literal value"
//swift推断someString为String类型,因为他被初始化"Some string literal value"

3.1初始化一个空字符串

//创建空字符串有两种方式:
var emptyString = ""// empty string literal
var anotherEmptyString = String()// initializer syntax
//这连个变量都是空字符串
//检查一个字符串是否为空,可以通过他的布尔属性isEmpty来判断
if emptyString.isEmpty {
//  print("Nothing to see here")
}// prints "Nothing to see here"

3.2可变字符串--String Mutability

//你可以定义一个字符串变量,字符串可以被修改,或者定义一个字符串常量,字符串不可以被修改
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
//这是不同于oc里的字符串,你可以的定义一个NSMutableString来表明字符串可以被修改

3.3字符串是值类型--Strings Are Value Types

//swift的String类型是一个值类型,如果你定义一个字符串,那么字符串可以不复制当他被传递给方法或者函数的时候,或者当分配一个常量或者变量的时候,新的复制值可以被传递,不在是原来的值

3.4字符--Working with Characters

//通过for循环使用字符串的characters属性来遍历字符串里的每一个字符
//for character in "Dog!?".characters {
//    print(character)
//}
// D
// o
// g
// !
// ?
//同样,你可以定义一个字符常量或者变量
let exclamationMark: Character = "!"
//字符串是字符的集合,可以这样初始化字符串
let catCharacters: [Character] = ["C", "a", "t", "!", "?"]
let catString = String(catCharacters)
//print(catString)
// prints "Cat!?"

3.5连接字符串和字符

let str1 = "hello"
let str2 = " there"
var welcome = str1 + str2
// welcome now equals "hello there"
//你也可以这样做:
var instruction = "look over"
instruction += str2
// instruction now equals "look over there"
//你也可以连接一个字符通过String类型的append()方法
//let exclamationMark: Character = "!"
//welcome.append(exclamationMark)
// welcome now equals "hello there!"
//说明:你不可以将一个字符串或者字符连接到一个字符的后面,因为字符仅仅有一个

3.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"
//说明:括号里的插值不能包括\和换行符

3.7统一码--Unicode

//Unicode是一种国际标准,主要用在不同写系统中的文本的编码,处理,他能够使你展现任何语言的字符,
//统一码标量--Unicode Scalars
//Swift的String类型被编译为Unicode Scalars值,一个Unicode Scalars是一个独特的21位数字,比如: U+0061代表LATIN SMALL LETTER A ("a"),U+1F425代表FRONT-FACING BABY CHICK ("?")
//A Unicode scalar范围是 U+0000 到 U+D7FF,或者 U+E000 to U+10FFFF,不包括 U+D800 to U+DFFF
//特别的字符
// \0(空字符),\\ (反斜杠),\t (水平制表),\n (换行),\" (双引), \' (单引),\r (carriage return)
//任何一个Unicode scalar,表达式:\u{n},n是1到8位的十六进制数
let wiseWords = "\"Imagination is more important than knowledge\" - Einstein"
// "Imagination is more important than knowledge" - Einstein

let dollarSign = "\u{24}" // $,  Unicode scalar U+0024
//print(dollarSign)
let blackHeart = "\u{2665}"      // ♥,  Unicode scalar U+2665
//print(blackHeart)
let sparklingHeart = "\u{1F496}" // ?, Unicode scalar U+1F496

3.8统计字符--Counting Characters

//检索字符串中字符的个数,用String的characters的count属性
let unusualMenagerie = "Koala ?, Snail ?, Penguin ?, Dromedary ?"
//print("unusualMenagerie has \(unusualMenagerie.characters.count) characters")
// prints "unusualMenagerie has 40 characters"
//说明,字符串级联不影响字符串中字符串的个数,
//比如字符串"cafe"有四个字符,连接一个é,结果字符串任然有四个字符,最后一个字符是 é, not e
var word = "cafe"
//print ("the number of characters in \(word) is \(word.characters.count)")
// prints "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)")
// prints "the number of characters in café is 4"

3.9访问和修改字符串--Accessing and Modifying a String

//你可以通过字符串的方法或者属性或者点语法来修改字符串
//字符串索引
//每一个字符串都有一个相关的索引类型String.Index,它对应了字符串中每一个字符的位置
//正如上面提到的一样,不同的字符要求不同内存来存储,因此为了确定字符在字符串中的位置,因此你一定要从字符串的开始到结束迭代出每一个编码标量,基于这个原因,swift的字符串不可能被整型数值索引
//使用startIndex属性来获取字符串中第一个字符的位置,endIndex属性是字符串中最后一个字符的下一个位置,结果,对于一个字符串的下标来说,endIndex是一个非法的参数
//如果字符串为空,startIndex和endIndex相等
//通过调用predecessor()方法,可以立马获得String.Index的前一个索引;调用successor()这个方法,可以获得String.Index的下一个索引;调用advancedBy(_:)方法可以获得字符串中的任意一个索引
let greeting = "Guten Tag!"
//print(greeting[greeting.startIndex])
//G
//print(greeting[greeting.endIndex.predecessor()])
//!
//print(greeting[greeting.startIndex.successor()])
//u
//let index = greeting.startIndex.advancedBy(2)
//print(index)
//print(greeting[index])
//t
//尝试获得字符串之外的字符会报错,
//greeting[greeting.endIndex]//报错
//greeting.endIndex.successor()//报错
//通过characters属性的indices属性可以获得所有索引的集合,
for index in greeting.characters.indices {
//    print("\(greeting[index])",terminator: "")
//    print(greeting[index])
    
}
//插入和删除字符
//使用insert(_:atIndex:)方法来插入字符
var welcomes = "hello"
welcomes.insert("!", atIndex: welcomes.endIndex)
//print(welcomes)
// welcome now equals "hello!"
//使用insertContentsOf(_:at:)方法来插入字符串
welcomes.insertContentsOf(" there".characters, at: welcomes.endIndex.predecessor())
//print(welcomes)
//使用removeAtIndex(_:)方法来删除字符
welcomes.removeAtIndex(welcomes.endIndex.predecessor())
//print(welcomes)
// welcome now equals "hello there"
//使用removeRange(_:)方法来移除子字符串
let range = welcomes.endIndex.advancedBy(-6)..<welcomes.endIndex
welcomes.removeRange(range)
//print(welcomes)
// welcome now equals "hello"

3.10字符串比较--Comparing Strings

//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("These two strings are considered equal")
}
// prints "These two strings are considered equal"
//如果两个字符串或者字符的扩展字形集群相等,那么这两个字符串或者字符就是想等的,如果它们有相同的语言意思,那么扩展字形集群就是相等的,
//使用hasPrefix(_:)方法和hasSuffix(_:)方法,可以判断字符串是否以某个字符串开头或者结尾,参数都是String类型,返回值是Bool类型
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 sence in romeoAndJuliet {
    if sence.hasPrefix("Act 1 ") {
        ++act1SceneCount
    }
}
//print("There are \(act1SceneCount) sences in Act 1")
// prints "There are 5 scenes in Act 1"
//类似的可以用 hasSuffix(_:) 来判断是否已某个字符串结尾
var mansionCount = 0
var cellCount = 0
for sence in romeoAndJuliet {
    if sence.hasSuffix("Capulet's mansion") {
        ++mansionCount
    }else if sence.hasSuffix("Friar Lawrence's cell") {
        ++cellCount
    }
}
//print("\(mansionCount) mansion scenes; \(cellCount) cell scenes")
// prints "6 mansion scenes; 2 cell scenes"

3.11字符串的统一码代表--Unicode Representations of Strings

let dogString = "Dog!!?"
//UTF-8 Representation
//使用字符串的utf8属性迭代获得UTF-8 Representation
for codeUnit in dogString.utf8 {
//    print("\(codeUnit) ", terminator: "")
}
//print("")
// 68 111 103 226 128 188 240 159 144 182
//codeUnit的值(68 111 103)代表字符D,o,g,其UTF-8和字母对应ascii码值相同;(226 128 188)代表 DOUBLE EXCLAMATION MARK字符;(240, 159, 144, 182)代表DOG FACE

//UTF-16 Representation
for codeUnit in dogString.utf16 {
//    print("\(codeUnit) ",terminator: "")
}
//print("")
// 68 111 103 8252 55357 56374
//(8252),等于16进制数203C代表Unicode scalar U+203C for the DOUBLE EXCLAMATION MARK character,(55357 and 56374)代表DOG FACE

//Unicode Scalar Representation
//使用字符串的unicodeScalars属性迭代获得Unicode scalar representation,属性是UnicodeScalarView类型,它是UnicodeScalar类型的集合,每一个UnicodeScalar都有value属性,返回scalar’s 21-bit value,被UInt32值代表
//
for scalar in dogString.unicodeScalars {
//    print("\(scalar.value) ",terminator: "")
}
//print("")
// 68 111 103 8252 128054
for scalar in dogString.unicodeScalars {
//    print("\(scalar) ",terminator: "")
}
//print("")
//D o g ! ! ?


转载于:https://my.oschina.net/u/2493045/blog/631811

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值