swift4.0 字符与字符串

在Swift编程语言中,对字符的表示是独立于某一种特定的Unicode编码的。在Objective-C、Java等编成语言中,编译器内部一般以UTF-16编码格式保存并处理字符串序列,在swift编程语言中则直接通过Unicode标准组织所制定的标准码点来保存并处理字符串序列的

第一节 转义字符

在任何编程语言中都会有一些特殊字符无法显示在编辑器中,例如空字符。或者与编程语言中表示字符串的语法产生冲突的字符,例如双引号等。

对于与ASCII码兼容的转义字符,swift编程语言中使用倒斜杠作为转义字符的引导前缀,然后定义了以下特殊字符:

 1) "\0" 表示空字符,一般用于传统ASCII编码的字符串的结束符。
 2) "\\" 表示倒斜杠。
 3) "\t" 表示水平制表符。
 4) "\n" 表示换行。
 5) "\r" 表示回车。
 6) "\"" 表示双引号。
 7) "\'" 表示单引号。当然,一般单引号在Swift编程语言中表示字符或字符串字面量时不需要做转义,直接用 " ' " 也行。

/* 这里将会输出:
 The string is: Say, "Hello, world"!
 非常好!
 * 注意双引号与换行符的输出
*/
let s = "Say, \"Hello, world\"!\n非常好!"
print("The string is: \(s)")”

第二节 字符串的概述

一个字符串是一组字符序列,在Swift编程语言中使用String类型来表示字符串类型,使用var声明的字符串是可修改的,使用let声明的字符串是不可修改的,此外,字符串字面量是不可修改的。

// 这里用空字符串字面量创建一个字符串变量empty
var empty = ""
 
// 这里用默认字符串构造方法来创建一个空的字符串对象
empty = String()

// 这里用常用的字符串字面量来初始化一个字符串常量
let str = "hello"
 
// 这里直接通过指定字符序列的字符串构造方法创建一个字符串常量
let str2 = String("hello")
 
// 这里通过指定一个字符的字符串构造方法来创建一个字符串常量
let ch = String(Character("字"))

字符串的实例方法与属性,与数组对象类似。

1) " + " : 该操作符可将两个字符串拼接起来组成一个新的字符串
    eg:
         //输出结果为:  string =  I love you
         let string = "I " + "love " + "you"
         print("string = \(string)")

2) "+=" : 该操作符只适合可修改的字符串,可以将+=右边的字符串拼接到+=左边的可修改的字符串对象上
    eg:
         //输出结果为:string =  I love you
         var string = "I love "
         string += "you"
         print("string = \(string)")

3) "==" : 该操作符用来判断两个字符串的字符序列内容是否完全相同,相同返回:true,不相同返回:false
    eg:
          //输出结果为:result  = true
         let f_string = "l love you"
         let s_string = "l love you"
         print("result = \(f_string == s_string)")

4) "isEmpty" : 该实例属性用来判断字符串是否为空
     eg: 
          //输出结果为: is empty = false
          print("is empty = \(f_string. isEmpty)")

5) "contains(_:) " : 该实例方法用来判断是否包含某个子串
     eg: 
          //输出结果为: is contains = true
          print("is contains = \(f_string. contains("love"))")

6) "hasPrefix(_:)" : 该实例方法用来判断一个字符串的开头是否包含某个子串
     eg: 
          //输出结果为: is hasPrefix = true
          print("is hasPrefix = \(f_string. hasPrefix("l"))")

7) "hasSuffix(_:)" : 该实例方法用来判断一个字符串的末尾是否包含某个子串
     eg: 
          //输出结果为: is hasSuffix = true
          print("is hasSuffix = \(f_string. hasSuffix("you"))")
""

第三节 字符串插值

Swift编程语言提供一种十分便利的方式可将几乎任一类型的对象转换为一个字符串的表现形式,这在Swift中称为字符串插值。我们在之前打印中都有用到,语法很简单:(object) ,这里也是用了转义字符的语法,不过这里不能称为转义字符,因为我们要转换的是一组字符序列。

 let x = 10, y = 20
 // 这里声明了一个字符串常量s,
 // 并且用字符串插值的形式将x + y的结果表示在字符串字面量中,
 // 为s进行初始化
 let s = "x + y = \(x + y)”

第四节 字符串的characters属性

如果我们想要访问一个字符串的每个字符或者查看某个字符串的包含多少个字符,可以使用characters属性,要注意的是这里的characters属性并不是[character]类型,而是String.CharacterView 类型

    var str = "看旗帜:\u{1f1e8}"
 
    // 我们先观察当前str对象的长度,
    // 长度为5
    print("str count: \(str.characters.count)")
 
    print("before appending:", separator: "", terminator: " ")
 
    // 我们输出当前str中的字符序列
    for ch in str.characters {
          print("\(ch)", separator: "", terminator: " ")
    }
 
    print("")
 
    // 我们再新增一个字符
    str.append("\u{1f1f3}")
 
    // 输出当前字符串中字符个数,
    // 仍然为5
    print("str count: \(str.characters.count)")
 
    print("After appending:", separator: "", terminator: " ")

    // 最后,我们再逐一输出字符序列
    for ch in str.characters {
         print("\(ch)", separator: "", terminator: " ")
    }
 
    print("")

第五节 字符串的索引及字符访问

Swift编程语言转为String类型引入了索引类型String.Index用于表示字符串对象中字符序列的索引值,由于String.Index类型也遵循了Comparable协议,所以它可以作为范围操作符的操作数。

1) index(_:offsetBy:) :  通过该方法可以获取到指定的索引值,第一个参数填参考索引值,第二个参数填指定的偏移n,n为正数表示向后移n位,n位负数表示向前移n位。

2) index(_:offsetBy:limitedBy:) : 功能和上面一样,这里多了一个参数,第三个参数用于边界检测,如果索引结果超过了第三个参数指定的值,那么将返回空。

有了索引值之后,我们就可以拿他通过字符串的下标操作符获取字符串的指定子串,然后通过子串的character属性中的first或last来获取到当前指定的字符了。
在Swift4.0中字符串的下标操作符返回的是Substring类型,String类型的prefix(:)方法和suffix(:)方法返回的也是Substring类型

    let str = "看旗帜:🇨🇳"
    // str字符串对象的起始索引,索引值相当于0
    let startIndex = str.startIndex
 
    // str字符串对象的末尾索引,索引值相当于:
    // str.characters.count
    let endIndex = str.endIndex
 
    // index2作为索引2
    let index2 = str.index(startIndex, offsetBy: 2)
 
    // index3作为索引3
    let index3 = str.index(startIndex, offsetBy: 3, limitedBy: endIndex)!
 
    // 这里通过范围操作符构造一个Range<String.Index>对象,
    // 作为字符串下标操作符的参数,以获取子串。
    // 这里substr的类型为Substring类型
    var substr = str[index2 ..< index3]
 
    // 我们这里可以观察到,
    // substr.characters的first字符与last字符都是同一个,
    // 即“帜”这个字。
    var ch = substr.characters.first!
    print("ch = \(ch)")
 
    ch = substr.characters.last!
    print("ch = \(ch)")
 
    // 这里以index3作为参考索引,
    // 然后偏移-2表示往前移2个位置,
    // 所以index1的索引值对应的是1
    let index1 = str.index(index3, offsetBy: -2)
 
    /// 这里以endIndex作为参考索引,
    /// 它表示字符串最后一个元素再加1,
    /// 因此这里的index4实际是对倒数第二个字符的索引,
    /// 即指向中文全角的冒号
    let index4 = str.index(endIndex, offsetBy: -2)
 
    // 获取第二到倒数第二个字符
    substr = str[index1 ... index4[…]

    // 这里输出:
    // 子串为:旗帜:
    print("子串为:\(substr)")”

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

推荐阅读更多精彩内容