swift 字符串操作

特性:

 1. Unicode 编码规范: 可以使用任何字符,表情

 2. 与本地语言无关:无需去考虑汉子及其他字体乱码以及转码问题

 3. 高效

 4. 值类型:无论作为参数传递还是复制给别的常量或变量都会copy一份(是否真正copy一份在内存中取决于编译器的优化决定)

 5. 与 NSString 兼容

 String 的初始化方式

 使用字符串常量值初始化

var str = ""

var str1 = "Hello, playground"

  使用 init 方法初始化  

1. 字符串常量值初始化

   // str3, str4 效果与str, str1 效果相同,

 let str3 = String()

let str4 = String("Hello, playground") 

  2. charater及数组初始化

  let ch:Character = "A"

let str5 = String(ch)let catCharacters: [Character] = ["C", "a", "t", "!", "🐱"]

let catString = String(catCharacters)

  3. CharacterView 作为参数初始化

    String 的 CharacterView 属性是一个扩张字符簇的集合,它近似于人的可读字符。一些独立的字符,        如é”, “김”, and “🇮🇳 是由多个unicode 代码点组成,é(e\u{301}), 这些代码点通过Unicode的边界算法组        合成扩张字符簇中的字符,这个字符就是swift 中的Charater类型,CharacterView 中的每一个元素就        是一个Charater, 我们可以把CharacterView 看做是Charater的一个集合

  let poem = "'Twas brillig, and the slithy toves / " +    "Did gyre and gimbal in the wabe: / " +        "All mimsy were the borogoves / " +        "And the mome raths outgrabe."

  let result = poem.characters 

      print(result) 

  输出结果 :CharacterView(_core: Swift._StringCore(_baseAddress: Optional(0x0000600000177de0), _countAndFlags: 132, _owner: Optional(Swift._HeapBufferStorage)))

我们可以把这个结果转成数组  print(Array (result))

let excerpt = String(poem.characters.prefix(22)) + "..." // charaterView 初始化

print(excerpt)

CharacterView 只是swift中的一种编码形式,还有其他三种

 Unicode Scalar View

String 的 unicodeScalars 属性是unicode 标量的集合,基本的unicode占21个比特位。每一个unicodeScalar表示的标量等同于UTF-32。

 UTF-16 View:

String 的 utf16 属性是一个utf-16的编码集,每一个编码单元都是一个utf-16实例,占据16bit。在OC中,NSString的编码方式就是utf16

 UTF-8 View

String 的 utf8 属性是一个utf-8的编码集,每一个编码单元都是一个utf-8实例 占据8bit。当把String实例传给c APIs时使用的就是这种编码形式。

不同的字符编码形式所占的空间不同所以每一个编码单元所能表示的范围也不同,同一个字符串在不同的编码形式下会有不同的存储形式,会有不同的长度。


let cafe = "Cafe\u{301} du 🌍"

print(Array(cafe.characters))

print(cafe.unicodeScalars.map { $0.value })

print(Array(cafe.utf16))

print(Array(cafe.utf8))


结果:`

["C", "a", "f", "é", " ", "d", "u", " ", "🌍"]

[67, 97, 102, 101, 769, 32, 100, 117, 32, 127757]

[67, 97, 102, 101, 769, 32, 100, 117, 32, 55356, 57101]

[67, 97, 102, 101, 204, 129, 32, 100, 117, 32, 240, 159, 140, 141]

 从文件中初始化


do {

let abc = try String(contentsOfFile:"123", encoding:String.Encoding.utf8)

print(abc)

} catch  {

}


 长度计算

通过 character.count 计算字符串的长度,由于字符串采用的是扩张的字符集, 所以在一些情况下即使发生了修改其长度也可能不会这化


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”


访问和修改字符串

就像我们上面提到的,String在不同的编码下所占的内存空间是完全不同的,所以我们无法通过一个整型的下标值来定位一个字符的位置,如果想要通过下标来访问这样的方式来访问,我们就要用到String.Index。

startIndex: 第一个字符所在的位置

endIndex:  最后一个字符的下一位所在的位置


var str = "Cafe\u{301} du 🌍"

print(str.characters.count)

print(str[str.startIndex])

print(str[str.index(after: str.startIndex)])

let index = str.index(before: str.endIndex)

print(str[index])


如果想改变原字符串使用append

var a = "Hello"

a.append("abc")

print(a) // Helloabc

a 必须是变量


通过after 和before可以找到当前Index的上个位置或下一个位置.

let index = str.index(str.startIndex, offsetBy: 5)

print(str[index])

如果采用上面的方法,当结果超出endIndex 时就会报错,我们可以采用下面的方法来防止这样的错误发生,如果超出时就返回nil

let indexN = str.index(str.startIndex, offsetBy: 20, limitedBy: str.endIndex)

查找字符串的位置:

let index = str.characters.index(of: "a");

//查找第一个大写字母

let greeting = "hello, friEnd!"

if let i = greeting.characters.index(where: { $0 >= "A" && $0 <= "a" }) {

print("First capital letter: \(greeting[i])")

}

连接,格式化

连接两个字符串,并生成一个新的字符串

let a = "Hello"

let b = "World"

let c = a + b

print(a)  //  Hello

print(b)  // World

print(c) // HelloWorld

let  count = 10;

let result = "The result is \(count)"

print(result)

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

推荐阅读更多精彩内容

  • 1 .字符串字面量 String 在Swift中字符串字面量是由双引号" " 包裹着的 像我们在 Swift 3 ...
    iceMaple阅读 1,119评论 1 2
  • 53.计算字符 在字符串中获取字符值的数量, 可以使用字符串字符属性中的计数属性: let unusualMena...
    无沣阅读 1,068评论 0 4
  • /* split(" ")按照" "分割字符串,对每个分割出来的字符创建为String lazy是延迟调用 map...
    逗留阅读 250评论 0 0
  • 大家都知道画家梵高吧,这人一辈子作品无数,生前却只卖出去一幅画,贫困潦倒最后自杀,同样是画家,毕加索的画就很畅销,...
    青衣刀客阅读 299评论 0 0
  • 人生也像开往远方的列车,过去的风景虽美,可再也回不去了。有些人,有些事,即使曾经那么得记忆犹新,终抵不过流年似水,...
    呼延馨阅读 263评论 0 1