免费开源的iOS开发学习平台

Swift: 4 字符串和字符

字符串是由0个或多个字符组成的有限序列。在Swift语言中,字符串类型是String, 创建和操作字符串的语法和C语言中字符串操作相似。在Swift语言中,String类型与Objective-C的Foundation NSString类进行了无缝桥接。本章主要介绍String的一些特性。

定义字符串

  • 在Swift语言中,通过双引号”""“包裹着固定顺序的文本字符集构成的字符串字面量(String Literal)来给字符串变量和常量提供初始化的值。同时也可以通过初始化一个新的String实例进行赋值。
  • String类型是值类型,在进行字符串赋值操作时或者在函数中被传递时,会进行值复制操作。而在Cocoa中创建的NSString实例,被操作的或者传递的是该NSString实例的一个引用。下面展示了字符串的定义示例。
let aString = " A string with literal value"
let specailString = "String with \"special value\""
var emptyString = String()

//通过isEmpty属性判断字符串是否为空
if emptyString.isEmpty{
    print("emptyString is empty")
}


emptyString += aString //连接操作
var antoherString = emptyString //赋值操作,值复制
antoherString += specailString  //改变字符串
emptyString //跟antoherString不同了
  • 示例代码运行结果:

字符串基本操作

  • String 类型表示特定序列的Character(字符)类型值得集合。每一个字符值代表一个Unicode字符。在Swift程序中,可利用for-in循环来遍历字符串的characters属性。同时,可以通过characters的count属性来获取字符串的长度值。如下代码所示。
var str = "Hello Swift"
/*
 str.characters 是字符串变量的字符集合
 temp 是临时变量
 for in 会遍历字符集合,然后把每个字符赋值给临时变量
 */

for temp in str.characters {
    print(temp,terminator:"")
}
print("\nCount:",terminator:"");
let count = str.characters.count
print(count);
  • String可以通过加法运算符(+)相加在一起,并且创建一个新的字符串值。同时,也可以通过"+="来拼接组成新的字符串。
let constStr = "Who is"
var varStr = " Li's"
varStr = constStr + varStr
//现在varStr的值是"Who is"
varStr += " and Han"
//现在varStr的值是 "Who is Li's and Han"
  • 在Swift中,可以通过使用字符串插值的方式来构建新的字符串,也就是在其中包含常量、变量、字面量和表达式。插入的字符串字面量的每一项都被包裹在以反斜线为前缀的圆括号中,如下代码所示:
let one = 1
let two = 2
let output = "\(one) add \(two)  equal to \(one+two)"
//output的值是:1加上2等于3
  • 如果两个字符串以同一顺序包含完全相同的字符,则认为两者字符串相等。通过调用字符串的hasPrefix/hasSuffix方法来检查字符串是否拥有特定前缀/后缀。这两个方法均需要以字符串作为参数传入并返回Boolean值,并且都执行基本字符串和前缀/后缀字符串之间逐个字符的比较操作。
    let str1 = "I am a str."
    let str2 = "I am a str."
    let str3 = "I am a str too."
    if str1 == str2 {
        print("str1 is equal to str2")
    }
    //打印输出 "str1 is equal to str2"
    if str1 != str3{
        print("str1 is not equal to str3")
    }
    //打印输出 "str1 is not equal to str3"
    if str1.hasPrefix("I am"){
        print("str1 has prefix string \"I am\"")
    }
    //打印输出 "str1 has prefix string "I am""
    if str1.hasSuffix("str."){
        print("str1 has suffix string \"str.\"")
    }
    //打印输出 "str1 has suffix string "str.""
  • 示例代码运行结果,如下图。

获取和修改字符串中的值

可以通过使用下标语法或者使用字符串类型的函数、属性来读取或者修改字符串的值。

  • 由于字符序列中的每个字符占用的内存空间不同,所以不能通过整数下标这种方式来获取某个字符,相应地Swift为每个字符串提供了String.index类型来对应字符串中的每个字符的位置信息。String的startIndex属性可以获取字符串的第一个字符,endIndex属性指向的是最后一个字符的后一个位置。所以说,endIndex不是String的合法的下标。如果字符串为空,startIndex和endIndex相等。可以通过String类型的index(before:)和index(after:)函数来每次向前或者向后移动一个下标指针位置,也可以通过index(_:offsetBy:)函数来每次移动多个位置。示例代码如下。
let sayIt = "Just do It!"
sayIt[sayIt.startIndex] // J
sayIt[sayIt.index(before:sayIt.endIndex)] // !
sayIt[sayIt.index(after:sayIt.startIndex)]// u
let index = sayIt.index(sayIt.startIndex,offsetBy:5)
sayIt[index] //d

//for循环遍历字符串,通过字符串的characters的indices属性来获取字符串的所有的下标集合
for index in sayIt.characters.indices {
    print("\(sayIt[index]) ", terminator:"")
}
// 打印结果: "J u s t  d o  I t ! "

sayIt[sayIt.endIndex] // 报错,越界
sayIt.index(after: sayIt.endIndex) // 报错,越界
  • 可以通过使用String类型的insert(_:at)函数向字符串中插入一个字符,使用insert(contentsOf:at:)函数来插入一个字符串。相反的,使用remove(at:)来移除一个字符,使用removeSubrange(_:)来移除一段子字符串。如下示例代码:
var sayHello = "Say"
sayHello.insert("!",at:sayHello.endIndex)
//sayHello现在是“Say!"

sayHello.insert(contentsOf:" hello".characters, at: sayHello.index(before: sayHello.endIndex))
//sayHello现在是"Say hello!"

sayHello.remove(at:sayHello.index(before:sayHello.endIndex))
//sayHello现在是"Say hello"

let range = sayHello.index(sayHello.endIndex, offsetBy:-6)..<sayHello.endIndex
sayHello.removeSubrange(range)
//sayHello现在是“Say"
  • 示例代码运行如下截图。

示例代码

https://github.com/99ios/23.4