程序员

swift4.0 字符与字符串

2018-01-17  本文已影响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)")”

上一篇下一篇

猜你喜欢

热点阅读