前言

	public struct String
public class NSString : NSObject, NSCopying, NSMutableCopying, NSSecureCoding
  • Swift 语言主要使用 String 和 Character 来存储字符数据。String 是字符串类型,Character 是字符类型,一个或多个字符组成一个字符串。

  • String :

    • Swift 语言中的 String 类型与经典 Cocoa 或 Cocoa Touch 框架中的 Foundation NSString 类型进行了无缝衔接,Swift 语言中的 String 类型实现了 NSString 的大部分属性和方法,字符串搜索、拷贝、插入、删除等操作都有相应的 API 函数可以使用。

    • String 类型可以调用 NSString 类型的属性和方法,但是 NSString 类型不可以调用 String 类型独有的方法。并且以往框架中的任何要求使用 NSString 类型作为参数的函数,都可以使用 String 类型来替换,Swift 语言会自动将 String 类型转换为 NSString 类型。

    • Swift 语言中可以用 as 将 NSString 类型字符串转换为 String 类型。

      • 如:var str:String = (NSString(string: "beijing") as String)
    • Swift 语言中 String 类型声明为变量就可以被修改。而在 OC 中,需要通过选择 NSString 和 NSMutableString 来指定字符串是否可以被修改。

    • Swift 语言中不能直接将字符串当作字符数组那样通过使用下标访问指定字符。

    • Swift 语言支持字符串插值,你可以在长字符串中插入常量、变量、字面量和表达式,而不用经过特殊的转换,这使得创建用于展示、存储和打印的自定义字符串变的轻松自如。插入的值放在 “ ( ) ” 的括号中。

      • 如:let gameName = "2048"; print("hello my program name is \(gameName)")
    • Swift 语言使用值传递作为默认字符串拷贝方式,无论何时,传递的都是值的拷贝,当我们对 String 类型的变量或者常量进行赋值操作或当作函数/方法的参数传递时,这个变量或者常量的值会被拷贝,然后使用这个拷贝出的值进行赋值或者当作参数传递。

    • Swift 语言由于没有 length 属性,统计字符个数需要使用新的方法,在 Swift 2.2 中使用 characters.count 获取字符串中字符数量。NSString 的 length 属性在被 Swift 的 String 值访问时会被转换为 utf16count。所以 lrngth 属性是基于 UTF-16 表示的十六位 code units 数量,而不是基于 Unicode 字符,所以通过 count 返回的字符串数量并不总是与相同字符的 NSString 的 length 属性值相同。

      • 如:let str = "hello world"; print( str.characters.count )
  • Character :

    • 由于全面支持 Unicode 字符,每一个字符值代表一个 Unicode 字符,在 Swift 语言中表示字符使用 Character 类型。

    • Swift 语言声明字符时需要加上类型名称,否则会被推断为 String 类型。

      • 如:var doller:Character = "$"

1、字符串的输出

	let num:Int = 123

	// 直接输出 自动换行
print(num) // 使用字符串插值输出 自动换行 输出常量或变量
print("\(num)") // 使用强制类型转换输出 自动换行 输出常量或变量
print(String(num)) // 使用输出控制符输出 自动换行 且输出时间等信息 输出常量或变量
NSLog("%d", num) // 使用字符串插值输出 自动换行 且输出时间等信息 输出常量或变量
NSLog("\(num)") // 使用强制类型转换输出 自动换行 且输出时间等信息 输出常量或变量
NSLog(String(num))

2、字符串的创建

	// String 型字符串的创建

		// 创建字符变量,必须指明为 Character 类型,否则会被自动推断为 String
let str1:Character = "I" // 创建字符串变量,指明变量类型,未初始化
let str2:String // 创建字符串变量,指明变量类型,并赋值
let str3:String = "I Love China" // 创建字符串变量,未指明变量类型,自动推断为 String 类型
let str4 = "Hello World" // 直接通过另一个字符串创建,与 str3 的地址不同,是值复制
let str5:String = str3 // NSString 型字符串的创建 // 直接创建 NSString 类型字符串,未初始化
let nsStr1:NSString
let nsStr2:NSString = "123" // 由另一个 String 类型字符串创建
let nsStr3 = NSString(string: str4) // 由另一个 NSString 类型字符串创建
let nsStr4 = NSString(string: nsStr2) // 格式化创建 NSString 类型字符串
let nsStr5 = NSString(format: "age is %d, score is %d", 18, 120) // 由 C 语言的字符串创建字符串
let nsStr6:NSString? = NSString(CString: "bei jing nin hao", encoding: NSUTF8StringEncoding)
let nsStr7:NSString? = NSString(UTF8String: "bei jing nin hao") // 从 文件 创建,try? 异常处理,若文件不存在或读取错误返回 nil
let path = NSHomeDirectory() + "/Desktop/test.txt"
let nsStr8:NSString? = try? NSString(contentsOfFile: path, encoding: NSUTF8StringEncoding) // 从 Url 创建,try? 异常处理,若文件不存在或读取错误返回 nil
let url = NSURL(fileURLWithPath: NSHomeDirectory() + "/Desktop/test.txt")
let nsStr9:NSString? = try? NSString(contentsOfURL: url, encoding: NSUTF8StringEncoding)

3、字符串长度的计算

	// String 型字符串

		let str1:String = "zhou dong yu"

		// 计算字符串中字数长度,不是字符长度,代替 count(str1)
let num1:Int = str1.characters.count // NSString 型字符串 let str2:NSString = "hello world" // 计算字符串中字数长度,不是字符长度
let num2:Int = str2.length

4、字符串位置的获取

	// String 型字符串

		let str:String = "bei jing ni hao"

		// 获取起始位置,即 0
let startIndex = str.startIndex // 获取结束位置,指 字符串的结束字符 \0 的位置
let endIndex = str.endIndex // 获取指定位置下标值,指从 str.startIndex 开始的第 n 个位置,代替 advance(str.startIndex, 2)
let index = str.startIndex.advancedBy(2) // 获取下标区间值
let range = str.startIndex.advancedBy(4)...str.startIndex.advancedBy(6) // 获取指定位置下标的 前一个值
let predecessorIndex = str.startIndex.advancedBy(2).predecessor() // 获取指定位置下标的 后一个值
let successorIndex = str.startIndex.advancedBy(2).successor()

5、字符串成员的引用(取字符)

	// String 型字符串

		let str1:String = "bei jing ni hao"

		// 取第5个字符
let substr1:String = str1.substringWithRange(str1.startIndex.advancedBy(4)...str1.startIndex.advancedBy(4)) // NSString 型字符串 let str2:NSString = "bei jing ni hao" // 取第5个字符
let substr2:unichar = str2.characterAtIndex(4)

6、字符串的连接

	// String 型字符串

		let str1:String = "bei "
let str2:String = "jing " // 使用 "+" 号连接两个字符串
var str3:String = str1 + str2 // 在字符串的末尾拼接字符串,代替 str3.extend("123456789")
str3.write("123456789") // 参数和返回值都为 String 型
let str4:String = str1.stringByAppendingString(str2) // 参数和返回值都为 String 型
let str5:String = str1.stringByAppendingFormat(str2)
let str6:String = str1.stringByAppendingFormat("%@", "jing huan ying ni") // NSString 型字符串 let str7:NSString = "bei "
let str8:NSString = "jing " // 参数和返回值都为 String 型
let str9:String = str7.stringByAppendingString((str8 as String)) // 参数和返回值都为 NSString 型
let str10:NSString = str7.stringByAppendingFormat(str8)
let str11:NSString = str7.stringByAppendingFormat("%@", "jing huan ying ni") // NSMutableString 型字符串
let str12:NSMutableString = "bei " // 追加
str12.appendString("jing ") // 格式化追加
str12.appendFormat("age is %d", 18)

7、字符串的比较

	// String 型字符串

		let str1:String = "bei jing"
let str2:String = "BEI JING" // 判读两个字符串是否相等
let bl1:Bool = str1 == str2 // 判断字符串是否为空
let bl2:Bool = str1.isEmpty // 判断字符串前缀
let bl3:Bool = str1.hasPrefix("be") // 判断字符串后缀
let bl4:Bool = str2.hasSuffix("ing") // 比较两个字符串
let result1:NSComparisonResult = str1.compare(str2) // 忽略大小写比较
let result2:NSComparisonResult = str1.caseInsensitiveCompare(str2) // NSString 型字符串 let str3:NSString = "bei jing"
let str4:NSString = "BEI JING" // 判读两个字符串是否相等
let bl5:Bool = str3 == str4 // 判读两个字符串是否相等
let bl6:Bool = str3.isEqual(str4) // 判读两个字符串是否相等
let bl7:Bool = str3.isEqualToString(str4 as String) // 判断字符串前缀
let bl8:Bool = str3.hasPrefix("be") // 判断字符串后缀
let bl9:Bool = str3.hasSuffix("ing") // 忽略大小写比较
let result3:NSComparisonResult = str3.compare(str4 as String)
let result4:NSComparisonResult = str3.caseInsensitiveCompare(str4 as String)

8、字符串的大小写转换

	// String 或 NSString 型字符串 返回值都为 String 型

		let str1 = "bei JING"

		// 将字符串转换为大写
let str2 = str1.uppercaseString // 将字符串转换为小写
let str3 = str1.lowercaseString // 将字符串的单词首字母大写
let str4 = str1.capitalizedString

9、字符串与数字的相互转换

	// String 型字符串

		// 字符 转 数字

			let char:Character = "A";

			var charVal1:Int = 0

			// 遍历字符转换为的字符串
for charStr in String(char).unicodeScalars { // 将取出的字符转换为 Int 型数字
charVal1 = Int(charStr.value)
} // 字符串 转 数字 // 数字型字符串 转 Int 型数字,代替 intStr.toInt()
let intStr:String = "64"; let intVal1:Int? = Int(intStr) // 数字 转 字符
let intVal2 = 65; let charVal2:Character = Character(UnicodeScalar(intVal2)) // 数字 转 字符串 // Int 型数字 转 字符串
let intVal3:Int = 123; let intStr1:String = intVal3.description // Int32 型数字 转 字符串
let int32Val1:Int32 = 32; let int32Str1:String = int32Val1.description // Int64 型数字 转 字符串
let int64Val1:Int64 = 64; let int64Str1:String = int64Val1.description // Float 型数字转 字符串
let floatVal1:Float = 2.1; let floatStr1:String = floatVal1.description // Double 型数字转 字符串
let doubleVal1:Double = 162.1; let doubleStr1:String = doubleVal1.description // Bool 型 转 字符串
let boolVal1:Bool = true; let boolStr1:String = boolVal1.description // NSString 型字符串 // 字符串 转 数字 // 字符串 转 Int 型数字
let intVal4:Int = NSString(string: "6432").integerValue // 字符串 转 Int32 型数字
let int32Val2:Int32 = NSString(string: "32").intValue // 字符串 转 Int64 型数字
let int64Val2:Int64 = NSString(string: "64").longLongValue // 字符串 转 Float 型数字
let floatVal2:Float = NSString(string: "2.1").floatValue // 字符串 转 Double 型数字
let doubleVal2:Double = NSString(string: "162.1").doubleValue // 字符串 转 Bool 型
let boolVal2:Bool = NSString(string: "false").boolValue

10、在字符串中查找子串的位置

	// NSString 型字符串

		let str1:NSString = "bei jing nin hao nin hao"
let str2:String = "nin" // 顺序查找 // 从前往后查找,找到第一个即停止查找
let range1 = str1.rangeOfString(str2) // 或者 if(range1.length == 0), location 位置,length 长度
range1.location == NSNotFound ? print("not found") : print(range1) // 条件查找
/*
CaseInsensitiveSearch = 1, // “A”等同于“a”,不分大小写查找
LiteralSearch = 2, // Unicode 的点对点比较。它只在所有字符都用相同的方式组成的情况下才会返回相等。
BackwardsSearch = 4, // 在字符串的末尾开始反向搜索
AnchoredSearch = 8, // 只考虑搜索的起始点(单独使用)或终止点(当与 NSBackwardsSearch 结合使用时)。
// 这个方法可以用来检查前缀或者后缀,以及大小写不敏感(case-insensitive)或者
// 音调不敏感(diacritic-insensitive)的比较。 NumericSearch = 64, // 它对字符串里的数字排序 DiacriticInsensitiveSearch = 128, // “A” 等同于 “Å” 等同于 “Ä.”
WidthInsensitiveSearch = 256, // 一些东亚文字(平假名和片假名)有全宽与半宽两种形式
ForcedOrderingSearch = 512,
RegularExpressionSearch = 1024 // 使用正则表达式搜索
*/ // 从后往前查找,找到第一个即停止查找
let range2 = str1.rangeOfString(str2, options: NSStringCompareOptions.BackwardsSearch) range2.location == NSNotFound ? print("not found") : print(range2) // 范围内查找 // 在某个范围内查找
let range3 = str1.rangeOfString(str2,
options: NSStringCompareOptions.CaseInsensitiveSearch,
range: NSMakeRange(8, 10)) range3.location == NSNotFound ? print("not found") : print(range3)

11、字符串子串的提取(取子串)

	// String 型字符串

		let str1:String = "今天天气真不错,是风和日丽的,我们下午没有课,是心情也不错"

		// 从某个位置开始到结尾
let str2:String = str1.substringFromIndex(str1.startIndex.advancedBy(8)) // 从开始到某个位置
let str3:String = str1.substringToIndex(str1.startIndex.advancedBy(18)) // 某个范围内
let str4:String = str1.substringWithRange(str1.startIndex.advancedBy(10)...str1.startIndex.advancedBy(15)) // NSString 型字符串 let str5:NSString = "今天天气真不错,是风和日丽的,我们下午没有课,是心情也不错" // 从某个位置开始到结尾
let str6:String = str5.substringFromIndex(8) // 从开始到某个位置
let str7:String = str5.substringToIndex(18) // 某个范围内
let str8:String = str5.substringWithRange(NSMakeRange(10, 6))

12、字符串切割

	// String 型字符串

		let str1:String = "chen$chao$ni$hao$ma"
let str2:String = "bei$jing#ni@hao&ma" // 字符串 按照字符 切割
let arr1:Array = str1.componentsSeparatedByString("$") // 字符串 按照字符集 切割
let arr2:Array = str2.componentsSeparatedByCharactersInSet(NSCharacterSet(charactersInString: "$#@&")) // NSString 型字符串 let str3:NSString = "chen$chao$ni$hao$ma"
let str4:NSString = "bei$jing#ni@hao&ma"
let str5:NSString = "Users/JHQ0228/Desktop" // 字符串 按照字符 切割
let arr3:Array = str3.componentsSeparatedByString("$") // 字符串 按照字符集 切割
let arr4:Array = str4.componentsSeparatedByCharactersInSet(NSCharacterSet(charactersInString: "$#@&")) // 自动按照 "/" 分割字符串
let arr5:Array = str5.pathComponents

13、字符串的插入

	// String 型字符串

		var str1:String = "bei jing ying ni "

		// 指定位置插入字符,str1.endIndex 字符串末尾位置
str1.insert("!", atIndex: str1.endIndex) // 指定位置插入字符串,替代 str1.splice
str1.insertContentsOf("huan ".characters, at: str1.startIndex.advancedBy(9)) // NSMutableString 型字符串 let str2:NSMutableString = "bei jing ying ni" // 指定位置插入字符串
str2.insertString("huan ", atIndex: 9) // 重写全部字符串
str2.setString("nan jing huan ying ni")

14、字符串的删除

	// String 型字符串

		var str1:String = "bei jing ren min huan ying nin !"

		// 指定位置删除字符 "!"
str1.removeAtIndex(str1.endIndex.predecessor()) // 指定范围删除字符串 "ren min "
str1.removeRange(str1.startIndex.advancedBy(9)...str1.startIndex.advancedBy(16)) // 删除全部字符串
str1.removeAll(keepCapacity: true) // NSMutableString 型字符串 let str2:NSMutableString = "bei jing ren min huan ying nin !" // 删除指定范围的字符串
str2.deleteCharactersInRange(NSMakeRange(9, 8))

15、字符串的替换

	// String 型字符串

		var str1:String = "bei jing huan ying nin !"

		// 用字符替换指定位置的字符串
str1.replaceRange(str1.startIndex...str1.startIndex.advancedBy(2), with: "I") // NSMutableString 型字符串 var str2:NSMutableString = "bei jing huan ying nin !" // 替换指定位置的字符串
str2.replaceCharactersInRange(NSMakeRange(9, str2.length - 9), withString: "ni hao") // 查找并替换指定的字符串
str2.replaceOccurrencesOfString("in",
withString: "IN",
options: NSStringCompareOptions.LiteralSearch,
range: NSMakeRange(0, str2.length))