iOS开发之Swift篇(3)—— 字符串String

版本

Xcode 11.0
Swift 5.1

创建

两种方法创建:

// 1. 使用字面量
let aa = "aa"
// 2. 通过String实例化
let bb = String(aa)

创建空字符串:

let cc = ""
let dd = String()

多行字符串:

// 单行写法
let ee1 = "line1\nline2"

// 多行写法
let ee2 = """
line1
line2
"""

缩进. 从关闭引号(""")所在位置开始算每行的缩进, line1这行会被缩进

let ee3 = """
            line1
        line2
        """

续行符 (\).

let ee4 = """
line1_1 \
line1_2
"""
// 实际打印出一行 line1_1 line1_2

可变字符串

在 Objective-C 和 Cocoa 中,需要通过选择两个不同的类(NSString 和 NSMutableString)来指定字符串是否可以被修改。
Swift中, 常量不可被修改, 变量可修改.
可变字符串, 即使用var修饰字符串.

// 可变字符串
var ff = "修改前"
ff = "修改后"
print(ff)    // 打印 修改后

字符Character

// 创建字符
let aChar:Character = "!"
print(aChar)

// 使用字符数组创建字符串
let chars: [Character] = ["A", "p", "p", "l", "e"]
let str = String(chars)
print(str)

// 遍历字符串, 获取每一个字符的值
for character in "Dog!🐶" {
    print(character)
}
// D
// o
// g
// !
// 🐶

拼接

// 两个字符串直接相加
let gg = "gg"
let hh = "hh"
var ii = gg + hh
print(ii)    // 打印 gghh

// 字符串尾追加字符
let aChar: Character = "!"
ii.append(aChar)
print(ii)    // 打印 gghh!

索引/插入/删除

1. 索引
OC中, 字符串的索引是整数, 可以如下操作:

// 提取字符串:单个,指定位到末尾,开头至指定位置,指定区间
unichar aChar = [str1 characterAtIndex:5];
NSString *str4 = [str1 substringFromIndex:5];
NSString *str5 = [str1 substringToIndex:5];
NSString *str6 = [str1 substringWithRange:NSMakeRange(2, 4)];

Swift中, 字符串的索引不是整数, 而是一个索引类型String.Index。
使用 startIndex 属性可以获取一个 String 的第一个 Character 的索引。使用 endIndex 属性可以获取最后一个 Character 的后一个位置的索引。因此,endIndex 属性不能作为一个字符串的有效下标。如果 String 是空串,startIndex 和 endIndex 是相等的。

let str = "Hello, world"
let startIndex = str.startIndex
let endIndex = str.endIndex
print(startIndex)    // Index(_rawBits: 1)
print(endIndex)      // Index(_rawBits: 786433)

通过调用 String 的 index(before:) 或 index(after:) 方法,可以立即得到前面或后面的一个索引。
也可以通过调用 index(_:offsetBy:) 方法来获取对应偏移量的索引。
还可以通过调用 firstIndex(of:) 方法来获取某个字符第一次出现所对应的索引值

let str = "Hello, world"
let startIndex = str.startIndex
let endIndex = str.endIndex

// 第二个字符索引
let secondIndex = str.index(after: startIndex)
// 最后一个字符索引
let lastIndex = str.index(before: endIndex)
// 从某一索引往前/后偏移(注意偏移值可正可负)多少位所对应的索引 
let customIndex = str.index(startIndex, offsetBy: 5)
// 某一个字符在字符串中的索引
let rIndex = str.firstIndex(of: "r")    // 返回可选类型

// 打印索引对应的字符
print(str[startIndex])          // H
print(str[secondIndex])         // e
print(str[lastIndex])           // d
print(str[customIndex])         // ,
if rIndex != nil {
    print(str[rIndex!])         // r
}

遍历索引值:

// 遍历索引值
for index in str.indices {
   print("\(str[index])", terminator: "")  // 不换行打印
}
// 打印输出 Hello, world

2. 插入

// 插入字符
var welcome = "hello"
welcome.insert("!", at: welcome.endIndex)
// welcome 变量现在等于 "hello!"

// 插入字符串
welcome.insert(contentsOf:" there", at: welcome.index(before: welcome.endIndex))
// welcome 变量现在等于 "hello there!"

3. 删除

// 删除字符
welcome.remove(at: welcome.index(before: welcome.endIndex))
// welcome 现在等于 "hello there"

// 删除字符串
let range = welcome.index(welcome.endIndex, offsetBy: -6)..<welcome.endIndex
welcome.removeSubrange(range)
// welcome 现在等于 "hello"

截取 (子字符串)

在前面索引小节中, 我们知道使用数组下标方式可以获取某个index对应的字符:

let str = "Hello, world"
print(str[str.startIndex])    // H

其实也可以使用这种方式来获取字符串.
但是注意, 此时获取到的字符串属于 SubString 类型. Swift 里的 SubString 绝大部分函数都跟 String 一样,意味着你可以使用同样的方式去操作 SubString 和 String。然而, SubString 重用了原 String 的内存空间, 这意味着, 只有在短时间内需要操作字符串时才使用SubString.
为了不给自己找麻烦, 干脆把获取到的SubString直接生成一个新的可全局使用的String比较稳妥:

let str = "Hello, world"
let customIndex = str.index(str.endIndex, offsetBy: -5)
let endIndex = str.endIndex
let tempStr = str[customIndex..<endIndex]    // 返回 SubString 类型实例
print(tempStr)    // 打印输出 world

// 把SubString转化为 String 以便长期存储。
let newStr = String(tempStr)

除了使用数组下标方式, Swift还提供了两种方式来获取字符串的开头部分和结尾部分:

// 获取字符串的前5个字符
let tempStr2 = str.prefix(5)
let newStr2 = String(tempStr2)

// 获取字符串的后5个字符
let tempStr3 = str.suffix(5)
let newStr3 = String(tempStr3)

插值

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

// 插值
var varA   = 20
let constA = 100
var varC:Float = 20.0

var stringA = "\(varA) 乘于 \(constA) 等于 \(varC * 100)"
print( stringA )
// 20 乘于 100 等于 2000.0

字符串比较

// 相等
let aa = "Hello"
let bb = "Hello"
if aa == bb {
    print("aa等于bb")
}

// 前缀/后缀
let cc: String = "Hello, world"
if cc.hasPrefix("He") {
    print("有前缀He")
}
if cc.hasSuffix("ld") {
    print("有后缀ld")
}

// 包含字符
if cc.contains("r") {
    print("包含字符r")
}
// 包含字符串 (要导入Foundation)
import Foundation
if cc.contains("llo") {
    print("包含字符串llo")
}

字符串函数

isEmpty
判断字符串是否为空,返回布尔值

	
hasPrefix(prefix: String)
检查字符串是否拥有特定前缀

	
hasSuffix(suffix: String)
检查字符串是否拥有特定后缀

	
Int(String)
转换字符串数字为整型

	
String.count
计算字符串的长度 (Swift 3 版本使用的是 String.characters.count)

utf8
UTF-8 编码

utf16
utf16 编码

unicodeScalars
Unicode 标量编码

字符串运算符

+
连接两个字符串,并返回一个新的字符串

+=
连接操作符两边的字符串并将新字符串赋值给左边的操作符变量

==
判断两个字符串是否相等

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

!=
比较两个字符串是否不相等
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值