天天看點

swift string概覽——boolean

一 使用字元串

1.1基本操作

這裡需要注意的地方是,在swift中字元串不能str[0]這樣的索引方式來通路字元串。字元串的index時一個Swift定義的特殊值。

Swift3.0字元串基本操作函數改動還蠻多的,比如successor(),predecessor(),startIndex.advancedBy(4)均被替換。在下面的代碼示例中有說明。

//: [Previous](@previous)
import Foundation
var str = "Hello, playground"

//: [Next](@next)

var str1="Hello"
let str2=",Swift"

// 枚舉字元
for item in str1.characters{
    print(item)
}
//這裡的索引不是Int,是一個特殊類型
for index in str1.characters.indices{
    print(str1[index])
}

//字元串 長度
print(str1.characters.count)

//具體通路某一個索引不能使用str[0]這種方式,他的索引是一個特殊值
//列印的是第一個位置
print(str1[str1.startIndex])

//str1.endIndex 是字元串的下一位 
//successor() 在index前一位的字元
print(str1[str1.index(after:str1.startIndex)])

//predecessor()在index後一位的字元
print(str1[str1.index(before:str1.endIndex)])

//startIndex.advancedBy(4)
let index = str1.index(str1.startIndex,offsetBy)
print(str1[index])
           

1.2其他操作

appendContentOf方法也替換,沒有要補充。見下面代碼

//連接配接字元串
//appendContentOf也沒有了
str1.append(",World")
var str3=str1+str2
str1+=str2
var char:Character="!" //字元這裡顯示聲明,并用了“”号
str1.append(char)

//字元串轉義
let heart="\u{2665}"
print(heart)
let words="\tHello"
print(words)

//字元串插值
var x
var y
var text="[\(x),\(y)]"


//字元串比較
var text1="Swift"
var text2="Swift"
var text3="swift"
print(text1==text2)
print(text1==text3)
           

二 字元串記憶體模型

String是一個struct,但内部包含一個指向堆上的“内容指針”,其指向的堆上存放真正的字元串内容。

這裡要結合的copy-on-write很好了解。

swift string概覽——boolean

下面例子中。所有輸出均為24。

//: Playground - noun: a place where people can play
import UIKit
var str = "Hello, playground"
var str1:String="Hello"
var str2="Hello,World"
var str3="I am programming in Swift"

print(MemoryLayout.size(ofValue: str1))
print(MemoryLayout.stride(ofValue: str1)) //考慮記憶體對齊

print(MemoryLayout.size(ofValue:str2))
print(MemoryLayout.stride(ofValue:str2))
           

三 copy-on-write

最佳實踐:盡量不改變字元串,盡量使用常量字元串let

copy-on-write的目的是為了優化記憶體的使用。因為string是值類型的對象,且在struct裡面含有指針。在這裡做了對指針所值的對象做了一個引用計數。當引用計數大于2時,給需要更改的對象配置設定新的位址。

如下圖所示:當string2=string時,内容指針指向同一塊記憶體

swift string概覽——boolean

當string的内容需要改變了,為string重新配置設定快記憶體,并将原來的值進行拷貝,然後将字元串的修改值拷貝進去。string2指向的是最開的記憶體單元

swift string概覽——boolean
//: [Previous](@previous)
import Foundation
var str = "Hello, playground"
//: [Next](@next)
var str1=str
str.append("!Hello,swift!")
print(str)
print(str1)
           

四 String Capacity

最佳實踐:預先配置設定号一定容量,避免以後capacity的增長

字元串初始化後,會配置設定一個緩存容量capacity,其長度一般大于實際的字元數量。

- 增長方式與OC相同,其中str.reserveCapacity(10000)為設定capacity的函數

- 增長代價,配置設定新記憶體2*capacity,将原來堆記憶體上的内容拷貝到新記憶體,釋放原來的堆記憶體

//: [Previous](@previous)
import Foundation
var str = "Hello, playground"
//: [Next](@next)
print(str.characters.count)
print(str)
//目前沒有輸出Capacity的函數或屬性
str.reserveCapacity(10000)
print(str.characters.count)