Swift3.1_字符串

字符串字面量

您可以在您的代码中包含一段预定义的字符串值作为字符串字面量。字符串字面量是由双引号""包裹着的具有固定顺序的文本字符集。 字符串字面量可以用于为常量和变量提供初始值:

let someString = "Some string literal value"

someString常量通过字符串字面量进行初始化,Swift会推断该常量为String类型。

初始化空字符串

要创建一个空字符串作为初始值,可以将空的字符串字面量赋值给变量,也可以初始化一个新的String实例:

var emptyString = ""               // 空字符串字面量
var anotherEmptyString = String()  // 初始化方法

判断该字符串是否为空:

print(emptyString.isEmpty)    // true

字符串可变性

您可以通过将一个特定字符串分配给一个变量来对其进行修改,或者分配给一个常量来保证其不会被修改

var variableString = "hello"
variableString += " world"
// variableString 现在为 "hello world"

let constantString = "hello"
constantString += " world"
// 这会报告一个编译错误 (compile-time error) - 常量字符串不可以被修改。

字符串是值类型

String的定义就是一个结构体,结构体是值类型。在Swift中struct和class的区别中进行了详细描述。

public struct String {
  ...
}

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

var str1 = "hello"
var str2 = str1
str2 = "hello world"
print("str1: "+str1+"  str2: "+str2)
// str1: hello  str2: hello world

字符

Swift中用characters表示字符。

for character in "Dog".characters {
    print(character)
}
// D
// o
// g

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

let catCharacters: [Character] = ["C", "a", "t", "!", "🐱"]
let catString = String(catCharacters)    // "Cat!🐱"

还可以判断字符串是否包含字符:

catString.contains("a")    // true

获取字符个数:

catString.characters.count    // 5

连接字符串和字符

通过加法运算符+连接在一起创建一个新的字符串:

let string1 = "hello"
let string2 = " world"
let welcome = string1 + string2    // welcome 现在等于 "hello world"

通过加法赋值运算符+=将一个字符串添加到一个已经存在字符串变量上:

var string = "hello"
string += " world"    // string 现在等于 "hello world"

append()方法将一个字符附加到一个字符串变量的尾部:

var string = "hello world"
let ch: Character = "!"
string.append(ch)    // string 现在等于 "hello world!"
string.append("...") // string 现在等于 "hello world!..."

字符串插值

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

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

注意:
插值字符串中写在括号中的表达式不能包含非转义反斜杠\,并且不能包含回车或换行符。不过,插值字符串可以包含其他字面量。

Unicode

Unicode是一个国际标准,用于文本的编码和表示。 它使您可以用标准格式表示来自任意语言几乎所有的字符,并能够对文本文件或网页这样的外部资源中的字符进行读写操作。SwiftStringCharacter类型是完全兼容Unicode标准的。

Unicode 标量

SwiftString类型是基于Unicode标量建立的。Unicode标量是对应字符或者修饰符的唯一的21位数字,注意不是所有的21Unicode标量都代表一个字符,因为有一些标量是留作未来分配的。

字符串字面量的特殊字符

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

  • 转义字符
    空字符\0、反斜线\\、水平制表符\t、换行符\n、回车符\r、双引号\"、单引号\'
  • 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

访问字符串

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

  • 第一个索引
    let string = "hello world"
    let start = string.startIndex    // String.Index 类型
    string[start]                    // 结果 h
    
  • 最后一个索引
    使用endIndex属性可以获取最后一个Character的后一个位置的索引。因此,endIndex属性不能作为一个字符串的有效下标。
    string[string.endIndex]       // 越界错误 
    string.index(after: endIndex) // 越界错误 
    
  • 索引
    通过上一个索引和下一个索引获取对应索引:
    string[string.index(after: string.startIndex)] // 第二个 e
    string[string.index(before: string.endIndex)]  // 最后一个字符 d
    
    通过偏移量获取对应的索引:
    let index = string.index(string.startIndex, offsetBy: 4)
    string[index]    // o
    
  • 根据字符获取索引
    let index = string.index(of: "w")
    

修改字符串

插入
var welcome = "hello"

welcome.insert("!", at: welcome.endIndex)
// welcome 变量现在等于 "hello!"

welcome.insert(contentsOf:" world".characters, at: welcome.index(before: welcome.endIndex))
// welcome 变量现在等于 "hello world!"
删除
welcome.remove(at: welcome.index(before: welcome.endIndex))
// welcome 现在等于 "hello world"

let range = welcome.index(welcome.endIndex, offsetBy: -6)..<welcome.endIndex
welcome.removeSubrange(range)
// welcome 现在等于 "hello"
替换
var welcome = "hello world"
let range = welcome.index(welcome.startIndex, offsetBy: 6)..< welcome.endIndex
welcome.replaceSubrange(range, with: "Swift")
// welcome 现在等于 "hello Swift"

前缀、后缀相等

let string = "hello world"
string.hasPrefix("a")    // false
string.hasSuffix("d")    // true

大小写切换

string.lowercased()
string.uppercased()

字符串转数组

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

推荐阅读更多精彩内容