swift string概览——boolean

6 篇文章 0 订阅

一 使用字符串
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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值