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:4)
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=100
var y=200.0
var text="[\(x),\(y)]"


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

二 字符串內存模型
String是一個struct,但內部包含一個指向堆上的“內容指針”,其指向的堆上存放真正的字符串內容。
這裏要結合的copy-on-write很好理解。

這裏寫圖片描述

下面例子中。所有輸出均爲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時,內容指針指向同一塊內存
這裏寫圖片描述
當string的內容需要改變了,爲string重新分配快內存,並將原來的值進行拷貝,然後將字符串的修改值拷貝進去。string2指向的是最開的內存單元
這裏寫圖片描述

//: [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)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章