Swift String(字符串) (Swift 2.2)

1. 初始化

字符串字面值:

let someString  = "Some string literal value"

空字符串:

let emptyString = ""
let anotherEmptyString = String()

if emptyString.isEmpty { // nil 跟 "" 是两个不同的问题,因为 emptyString 和 anotherEmptyString 都是 string 类型而不是 string? 类型,所以这里不可能为  nil
    print("Nothing to see here")
}

2. Swift String 是值类型

Swift String 与 NSString 最本质的区别在于:Swift String 是值类型。这意味着,共同持有 NSMutableString 变量的设计将不得不被放弃。因为 Swift String 是值类型,所以 Swift 没有与 NSMutableString 对应的类型,你只能通过 var 和 let 来声明变量和常量。

字符串变量:

var variableString = "Horse"
var anotherVariableString = variableString
variableString += " and carriage"
print(variableString) // 变成了 "Horse and carriage"
print(anotherVariableString) // 仍然是 "Horse"

字符串常量:

let constantString = "Highlander"
constantString += " and another Highlander" // 编译器警告错误:常量不能被修改。注释掉这一行,或者把 let 改为 var, 才能通过编译

3. Character(字符)

Character 是一个单独的类型,用来表示一个单独的字符。另外,字符数组与字符串是两种不同的类型,不过你可以访问 string 的 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) // "Cat!"

4. 字符串拼接

String 使用 + 拼接另一个 String :

let string1 = "hello"
let string2 = " there"
var welcome = string1 + string2 
print(welcome) // "hello there"

String 使用 += 拼接另一个 String :

var instruction = "look over"
instruction += string2
print(instruction) // "look over there"

String 通过 append() 方法拼接一个 Character:

let exclamationMark: Character = "!"
welcome.append(exclamationMark)
print(welcome) // "hello there!"

注: Character 没法拼接 String,因为 Character 只能包含一个字符。

5. 字符串内插

使用 \() 把 String 内插到字面值中:

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

6. 求字符串长度

Swift 2.2 移除了 countElemtents 方法,现在只能够通过求 String 所对应的字符数组的长度,来求 String 的长度。

let aString = "This is a string."
let count = aString.characters.count
print(count) // 17

7. 访问和修改字符串

String 支持下标操作。

7.1 字符串索引

Index(索引) 是 String 的关联类型,用来定位 String 中的每一个 Character。你可以通过 startIndexendIndex 两个属性来获得 String 中第一个字符的 Index 和最后一个字符往后一个 Index。

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(7)
print(greeting[index]) // "a"

因为 endIndex 获取的是 String 最后一个字符往后一个 Index,所以直接访问 String 的 endIndex 程序会在运行时发生崩溃。而访问 endIndexsuccessor 方法也会发生崩溃:

print(greeting[greeting.endIndex]) // 能通过编译,运行时崩溃
greeting.endIndex.successor() // 能通过编译,运行时崩溃

对于空字符串来说, startIndexendIndex 相等,都等于 0。否则,endIndex 应该大于 startIndex.

7.2 插入与删除

String 的插入与删除操作都是以 Character 为单位进行的。

插入单个字符:

var welcome = "hello"
welcome.insert("!", atIndex: welcome.endIndex)
print(welcome) // "hello!"

插入字符数组:

welcome.insertContentsOf(" there".characters, at: welcome.endIndex.predecessor())
print(welcome) // "hello there!"

删除单个字符:

welcome.removeAtIndex(welcome.endIndex.predecessor())
print(welcome) // "hello there"

删除一串字符:

let range = welcome.endIndex.advancedBy(-6)..<welcome.endIndex
welcome.removeRange(range)
print(welcome) // "hello"

8. 比较

因为 String 是值类型,所以只支持 ==!= 操作。

8.1 相等

字符串相等:

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 tow strings are considered equal")
}
// "These tow strings are considered equal"

因为 == 是值相等,所以两个字符串即使用不同的 Unicode 字面值,但是只要内容是一样的,值就是相等的。

let eAcuteQuestion = "Voulez-vous un caf\u{E9}?"
print(eAcuteQuestion) // "Voulez-vous un café?"

let combinedEAcuteQuestion = "Voulez-vous un caf\u{65}\u{301}?"
print(combinedEAcuteQuestion) // "Voulez-vous un café?"

if eAcuteQuestion == combinedEAcuteQuestion {
    print("These tow strings are considered equal")
}
// "These tow strings are considered equal"

字符相等:

let latinCapitalLetterA: Character = "\u{41}"
print(latinCapitalLetterA) // "A"

let cyrillicCapitalLetterA: Character = "\u{0410}"
print(cyrillicCapitalLetterA) // 看起来也是 "A",但实际上是俄文字符

if latinCapitalLetterA != cyrillicCapitalLetterA {
    print("These two characters are not equivalent") 
}
// "These two characters are not equivalent"

8.2 前缀、后缀

前缀:

let 中文字符串 = "我爱北京天安门"
if 中文字符串.hasPrefix("我爱") {
    print("前缀是我爱")
}
// 前缀是我爱

后缀:

if 中文字符串.hasSuffix("天安门") {
    print("后缀是天安门")
}
// 后缀是天安门
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,695评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,569评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,130评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,648评论 1 297
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,655评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,268评论 1 309
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,835评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,740评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,286评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,375评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,505评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,185评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,873评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,357评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,466评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,921评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,515评论 2 359

推荐阅读更多精彩内容