swift 字符串和字符

525 阅读5分钟

这是我参与更文挑战的第3天,活动详情查看: 更文挑战

swift的String类型是值类型。如果您创建了一个新的字符串,那么当其进行常量、变量赋值操作,或在函数或方法中传递时,会进行值拷贝。 任何情况下,都会对已有字符串值创建新副本,并对该新副本进行传递或赋值操作


字符串的初始化

var emptyString = ""           //通过字面量初始化空字符串
let someString = "hello world" //通过字面量初始化字符串

var anotherEmptyString = String()  // 初始化方法

//Character的数组初始化字符串
let charactersStr: [Character] = ["s", "w", "i", "f", "t"]
let str = String(charactersStr)

字符串判空

使用isEmpty属性

if keyNote.isEmpty {
    print("空空如也")
}

多行字符串

由一对三个双引号 """包裹着的具有固定顺序的文本字符集

let str = """
如果说冬天的北京出奇的冷

那我让你感受下冬天的杭州
"""
print(str)

log:
如果说冬天的北京出奇的冷

那我让你感受下冬天的杭州

可变字符串(var)

swift中的可变字符串与OC中的可变字符串不同,OC在两个类(NSString和NSMutableString)之间进行选择,swift用letvar作区别

var message = "产品经理"
message += "要怎样?"  //产品经理要怎样?

计算字符串长度(count)

var string = "产品经理要怎样"
print(string.count)    // 7

字符串遍历

  • 通过for-in循环遍历字符串来访问String的各个Character
for character in "swift" {
    print(character)
}

log:
s
w
i
f
t
  • 使用 indices 属性会创建一个包含全部索引的范围(Range),用来在一个字符串中访问单个字符。
let someString = "dog"
for index in someString.indices {
    print(someString[index])
}
// d
// o
// g

字符串拼接

let message = "产品经理"
let result = "\(message)要怎样?"  //产品经理要怎样?
  • String值可以与加法运算符+添加(或连接)在一起来创建新String值
let str1 = "产品经理"
let str2 = "要怎样?"
var message = str1 + str2 //产品经理要怎样?

var message = "产品经理"
message += "要怎样?"  //产品经理要怎样?
  • 使用String类型的方法append()将Character值附加到String变量
let mark: Character = "?"
var string = "产品经理要怎样"
string.append(mark)  //产品经理要怎样?

字符串的索引

  • startIndex 是获取字符创中的第一个字符的索引
  • endIndex 是字符串中最后一个字符的后一个字符的索引(endIndex是字符串索引种的非法下标,超出了字符串的范围)
  • index(before:) 得到前面的一个索引
  • index(after:) 得到后面的一个索引
  • index(_:offsetBy:) 获取对应偏移量的索引
let someString = "developer"
print(someString[someString.startIndex])    //d
print(someString[someString.index(before: someString.endIndex)])    //r
print(someString[someString.index(after: someString.startIndex)])   //e
let index = someString.index(someString.startIndex, offsetBy: 5)
print(someString[index])    //o

字符串的插入

  • insert(_:at:)可以将单个字符插入到指定索引处的字符串中
var someString = "developer"
someString.insert("!", at: someString.endIndex)
// someString = developer!
  • insert(contentsOf:at:)指定索引处插入另一个字符串的内容
var someString = "developer"
someString.insert(contentsOf: "are great", at: someString.endIndex)
// someString = developer are great

字符串的删除

remove(at:)要从指定索引处的字符串中删除单个字符

var someString = "developer!"
someString.remove(at:someString.index(before: someString.endIndex))
// someString = developer

removeSubrange(_:)可以在一个字符串的指定索引删除一个子字符串

let range = someString.index(someString.endIndex, offsetBy: -10) ..< someString.endIndex
someString.removeSubrange(range)
// someString = developer

字符串替换

let str = "aa$$bb$$cc$$dd"
let str2 = str.replacingOccurrences(of: "$$", with: "**")  
//aa**bb**cc**dd

字符串截取

Swift 里的 SubString 绝大部分函数都跟 String 一样,意味着你可以使用同样的方式去操作 SubStringString。然而,StringSubString 的区别在于性能优化上,SubString 可以重用原 String 的内存空间,或者另一个 SubString 的内存空间(String 也有同样的优化,但如果两个 String 共享内存的话,它们就会相等)。这一优化意味着你在修改 StringSubString 之前都不需要消耗性能去复制内存。 因为它重用了原 String 的内存空间,原 String 的内存空间必须保留直到它的 SubString 不再被使用为止你只有在短时间内需要操作字符串时,才会使用 SubString。当你需要长时间保存结果时,就把 SubString 转化为 String 的实例

png

let str = "developer"
let index = str.firstIndex(of: "v") ?? str.endIndex
let sub = str[...index]    //dev
let sub1 = str[index ..< str.endIndex]    //veloper
let sub2 = str[str.startIndex ..< index]  //de

// 把结果转化为 String 以便长期存储
let newString = String(sub)

str 是一个 String,意味着它在内存里有一片空间保存字符集。而由于 sub 是 str 的 SubString,它重用了 str 的内存空间。相反,newString 是一个 String —— 它是使用 SubString 创建的,拥有一片自己的内存空间


比较字符串(字符串字符相等、前缀相等和后缀相等)

  • 判断字符串/字符是否相等用==!=
let str1 = "develop are great"
let str2 = "develop are great"
if str1 == str2 {
   print("字符串相同")
}
  • 前缀/后缀相等 通过调用字符串的hasPrefix(_:)hasSuffix(_:)方法来检查字符串是否拥有特定前缀/后缀,两个方法均接收一个String类型的参数,并返回一个布尔值
let romeoAndJuliet = [
    "Act 1 Scene 1: Verona, A public place",
    "Act 1 Scene 2: Capulet's mansion",
    "Act 1 Scene 3: A room in Capulet's mansion",
    "Act 2 Scene 1: Outside Capulet's mansion",
    "Act 2 Scene 2: Capulet's orchard",
    "Act 2 Scene 3: Outside Friar Lawrence's cell"
]
var act1SceneCount = 0
for scene in romeoAndJuliet {
    if scene.hasPrefix("Act 1 ") {
        act1SceneCount += 1
    }
}
print("There are \(act1SceneCount) scenes in Act 1")
//There are 3 scenes in Act 1

var mansionCount = 0
var cellCount = 0
for scene in romeoAndJuliet {
    if scene.hasSuffix("Capulet's mansion") {
        mansionCount += 1
    } else if scene.hasSuffix("Friar Lawrence's cell") {
        cellCount += 1
    }
}
print("\(mansionCount) mansion scenes; \(cellCount) cell scenes")
//3 mansion scenes; 1 cell scenes

字面量中的特殊字符

  • \0(空字符)\(反斜线)\t(水平制表符)\n(换行符)\r(回车符)"(双引号)'(单引号)
  • Unicode 标量,写成\u{n}(u为小写),其中n为任意一到八位十六进制数且可用的Unicode位码。
let wiseWords = "\"Imagination is more important than knowledge\" - Einstein"
let dollarSign = "\u{24}"        
let blackHeart = "\u{2665}"      
let sparklingHeart = "\u{1F496}" 

print(wiseWords)  // "Imagination is more important than knowledge" - Einstein
print(dollarSign)  // $,  Unicode scalar U+0024
print(blackHeart)  // ♥,  Unicode scalar U+2665
print(sparklingHeart)  // 💖, Unicode scalar U+1F496