一、定义

1、创建字符串

//使用字符串字面量
var stringA = "Hello, World!"
print( stringA )
//String 实例化
var stringB = String("Hello, World!")
print( stringB )

输出结果

Hello, World!
Hello, World!

2、空字符串

// 使用字符串字面量创建空字符串
var stringA = ""

if stringA.isEmpty {
   print( "stringA 是空的" )
} else {
   print( "stringA 不是空的" )
}

// 实例化 String 类来创建空字符串
let stringB = String()

if stringB.isEmpty {
   print( "stringB 是空的" )
} else {
   print( "stringB 不是空的" )
}

输出结果

stringA 是空的
stringB 是空的

3、字符串常量

// stringA 可被修改
var stringA = "该字符串:"
stringA += "可以被修改!!!"
print( stringA )

// stringB 不能修改
let stringB = String("该字符串:")
//stringB += "不可以被修改!!!"
print( stringB )

输出结果:

该字符串:可以被修改!!!
Optional("该字符串:")

4、字符串中插入值

字符串插值是一种构建新字符串的方式,可以在其中包含常量、变量、字面量和表达式。 您插入的字符串字面量的每一项都在以反斜线为前缀的圆括号中:

var varA   = 20
let constA = 100
var varC: Float = 20.0 
var stringA = "\(varA) 乘于 \(constA) 等于 \(varC * 100)"
print( stringA )

输出结果:

20 乘于 100 等于 2000.0

5、字符串连接

字符串可以通过 + 号来连接,实例如下:

let stringA = "该字符串"
let stringB = "是可以这样被连接的"
let stringC = stringA + stringB
print( stringC )

输出结果:

该字符串是可以这样被连接的

6、Unicode 字符串

Unicode 是一个国际标准,用于文本的编码,Swift 的 String 类型是基于 Unicode建立的。你可以循环迭代出字符串中 UTF-8 与 UTF-16 的编码,实例如下:

var unicodeString   = "看,这是我的UTF"
print("UTF-8 编码: ")
for code in unicodeString.utf8 {
    print("\(code) ")
}
print("\n")
print("UTF-16 编码: ")
for code in unicodeString.utf16 {
    print("\(code) ")
}

输出结果:

UTF-8 编码: 
231 
156 
139 
239 
188 
140 
232 
191 
153 
230 
152 
175 
230 
136 
145 
231 
154 
132 
85 
84 
70 


UTF-16 编码: 
30475 
65292 
36825 
26159 
25105 
30340 
85 
84 
70

二、字符串函数及运算符

1、字符串长度

字符串长度使用 String.characters.count 属性来计算,实例如下:

let stringA = "你想知道我的长度吗,那就试一下吧!!!"
let count = stringA.characters.count
print( "\"\(stringA)\"长度为 \(count)" )

输出结果:

"你想知道我的长度吗,那就试一下吧!!!"长度为 19

2、字符串比较

(1)==

你可以使用 == 来比较两个字符串是否相等:

let varA   = "Hello, Swift!"
let varB   = "Hello, World!"
if varA == varB {
    print( "\(varA) 与 \(varB) 是相等的" )
} else {
    print( "\(varA) 与 \(varB) 是不相等的" )
}

输出结果:

Hello, Swift! 与 Hello, World! 是不相等的

(2)、!=

比较两个字符串是否不相等。

let varA   = "Hello, Swift!"
let varB   = "Hello, World!"
if varA != varB {
    print( "\(varA) 与 \(varB) 是不相等的" )
} else {
    print( "\(varA) 与 \(varB) 是相等的" )
}

输出结果:

Hello, Swift! 与 Hello, World! 是不相等的

(3)、< 与 >

比较两个字符串,对两个字符串的字母逐一比较。

let varA   = "Hello, Swift!"
let varB   = "Hello, World!"
if varA > varB {
    print( "\(varA) 字符串大于  \(varB) " )
} else {
    print( "\(varA) 字符串不大于 \(varB)" )
}
if varA < varB {
    print( "\(varA) 字符串小于  \(varB) " )
} else {
    print( "\(varA) 字符串小大于 \(varB)" )
}

输出结果:

Hello, Swift! 字符串不大于 Hello, World!
Hello, Swift! 字符串小于  Hello, World!

3、前缀和后缀

(1)字符串前缀hasPrefix

let name = "Hello,world!"
if name.hasPrefix("Hello") {
    print("有对应的 Hello 前缀")
} else {
    print("没有对应的 Hello 前缀")
}

输出结果:

有对应的 Hello 前缀

(2)、字符串后缀hasSuffix

let name = "Hello,world!"
if name.hasSuffix("!") {
    print("有对应的 ! 后缀")
} else {
    print("没有对应的 ! 后缀")
}

输出结果:

有对应的 ! 后缀

4、字符串大小写转换

(1)、字符串小写转换大写

var name = "Hello,world!"
name = name.uppercased()

输出结果:

HELLO,WORLD!

(2)、字符串大写转换小写

var name = "Hello,world!"
name = name.lowercased()

输出结果:

hello,world!

5、访问和修改字符串

每个String值都有一个关联的索引(index)类型,String.index,它对应着字符串中的每一个Character的位置

(1)、字符串索引

  • (1)、startIndex:获取一个Stirng的第一个Character的索引;
  • (2)、endIndex:获取一个String的最后一个Character的后一个位置的索引。因此改属性不能作为一个字符串的有效下标。注意:如果String是空串,startIndex和endIndex是相等的;
  • (3)、index(before:):可以立即得到index前面的一个索引
  • (4)、index(after:):可以立即得到index后面的一个索引
let greeting = "Hello,world!"
print("第一个字符是:\(greeting[greeting.startIndex])")
print("最后一个字符是:\(greeting[greeting.index(before: greeting.endIndex)])")
print("第二个字符是:\(greeting[greeting.index(greeting.startIndex, offsetBy: 1)])")
print("倒数第二个字符是:\(greeting[greeting.index(greeting.startIndex, offsetBy: greeting.characters.count - 2)])")

输出结果:

第一个字符是:H
最后一个字符是:!
第二个字符是:e
倒数第二个字符是:d

(2)、插入、删除、替换

  • (1)、insert(_:at:):可以在一个字符串的指定索引插入一个字符
  • (2)、insert(contentsOf:at:):可以在一个字符串的指定索引插入一个段字符串
  • (3)、remove(at:):可以在一个字符串的指定索引删除一个字符
  • (4)、removeSubrange(_:):可以在一个字符串的指定索引删除一个子字符串
  • (5)、replaceSubrange(_: with:):可以在一个字符串的指定索引替换一个字符串
  • (6)、replacingOccurrences(of: with:):将一个字符串中的固定字符串替换成其他字符串
  • (7)、replacingOccurrences(of: with: options: range:):将一个字符串中的固定字符串替换成其他字符串,可选择String.CompareOptions选项,例如忽略大小写字母。
var welcome = "hello,world"
welcome.insert("!", at: welcome.endIndex)
print(welcome)
welcome.insert(contentsOf: " there".characters, at: welcome.index(before: welcome.endIndex))
print(welcome)
welcome.remove(at: welcome.index(before: welcome.endIndex))
print(welcome)
let range01 = welcome.index(welcome.endIndex, offsetBy: -6)..<welcome.endIndex
welcome.removeSubrange(range01)
print(welcome)
let range02 = welcome.index(welcome.endIndex, offsetBy: -6)..<welcome.endIndex
welcome.replaceSubrange(range02, with: "!")
print(welcome)
welcome = welcome.replacingOccurrences(of: "hello", with: "world")
print(welcome)
welcome = welcome.replacingOccurrences(of: "WORLD", with: "HELLO", options: String.CompareOptions.caseInsensitive, range: nil)
print(welcome)

输出结果:

hello,world!
hello,world there!
hello,world there
hello,world
hello!
world!
HELLO!

6、去字符串前后多余的固定字符

(1)、删除前后多余的空格

let name01 = "   hello world!  "
print(name01)
let name02 = name01.trimmingCharacters(in: CharacterSet.whitespaces)
print(name02)

输出结果:

hello world!  
hello world!

(2)、删除前后指定的字符

let str1 = "...<<hangge.com>>..."
//删除前后<>
let characterSet = CharacterSet(charactersIn: "<>.")
let str2 = str1.trimmingCharacters(in: characterSet)
//打印结果
print("原字符串:\(str1)")
print("新字符串:\(str2)")

输出结果:

原字符串:...<<hangge.com>>...
新字符串:hangge.com

CharacterSet 里各个枚举类型的含义如下:
controlCharacters:控制符
whitespaces:空格
newlines:换行符
whitespacesAndNewlines:空格换行
decimalDigits:小数
letters:文字
lowercaseLetters:小写字母
uppercaseLetters:大写字母
nonBaseCharacters:非基础
alphanumerics:字母数字
decomposables:可分解
illegalCharacters:非法
punctuationCharacters:标点
capitalizedLetters:大写
symbols:符号

三、数据类型转换

1、转换成基本类型

(1)、String->Int

let stringInt = "123"
print(Int(stringInt) ?? "0")

输出结果:

123

(2)、String->Float

let stringFloat = "123"
print(Float(stringFloat) ?? "0.00")

输出结果:

123.0

(3)、String->Double

let stringDouble = "123"
print(Double(stringDouble) ?? "0.00")

输出结果:

123.0

(4)、String->Bool

let stringBool = "true"
print(Bool(stringBool) ?? false)

输出结果:

true

2、String->Array

let names = "boy,girl,man,woman"
let nameArr = names.components(separatedBy: ",")
print(nameArr)

let counts = "1,2,3,4,5,6.7.8.9"
let characters = CharacterSet.init(charactersIn: ",.")
let countArr = counts.components(separatedBy: characters)
print(countArr)

输出结果:

["boy", "girl", "man", "woman"]
["1", "2", "3", "4", "5", "6", "7", "8", "9"]

3、String->Data

let dataStr = "String to encode data"
let data = dataStr.data(using: .utf8)

四、遍历

let name = "xiao, where are you from?"
print("字符遍历")
for char in name.characters {
    print(char)
}
print("unicode遍历")
for code in name.unicodeScalars {
    print(code)
}

输出结果:

字符遍历
x
i
a
o
,

w
h
e
r
e

a
r
e

y
o
u

f
r
o
m
?
unicode遍历
x
i
a
o
,

w
h
e
r
e

a
r
e

y
o
u

f
r
o
m
?

五、获取字符串长度

// 计算字符串的宽度,高度
let string: String = "swift中计算字符串的宽度和高度。swift中计算字符串的宽度和高度。swift中计算字符串的宽度和高度。"
let font: UIFont = UIFont.systemFont(ofSize: 12)
let attributes = [NSFontAttributeName: font]
let option = NSStringDrawingOptions.usesLineFragmentOrigin
let rect:CGRect = string.boundingRect(with: CGSize(width: 100, height: 999), options: option, attributes: attributes, context: nil)
print("rect:\(rect)")

输出:

rect:(0.0, 0.0, 98.016, 85.921875)