swift 字符串和字符

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用let和var作区别,类似kotlin的 val和var

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

计算字符串长度(count)

print(string.count)    

字符串遍历

  • 通过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

字符串中插入值

var varA   = 20
let constA = 100
var varC:Float = 20.0

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

以上程序执行输出结果为:

20 乘于 100 等于 2000.0

字符串拼接

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)  //产品经理要怎样?
  • 使用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:)可以将单个字符插入到指定索引处的字符串中
  • insert(contentsOf:at:)指定索引处插入另一个字符串的内容
var someString = "developer"
someString.insert("!", at: someString.endIndex)
// someString = developer!

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


image.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

Swift 字符(Character)

  • Swift 的字符是一个单一的字符字符串字面量,数据类型为 Character。
import Cocoa

let char1: Character = "A"
let char2: Character = "B"

print("char1 的值为 \(char1)")
print("char2 的值为 \(char2)")

以上程序执行输出结果为:

char1 的值为 A
char2 的值为 B

如果你想在 Character(字符) 类型的常量中存储更多的字符,则程序执行会报错,如下所示:

// Swift 中以下赋值会报错
let char: Character = "AB"
print("Value of char \(char)")

Swift 中不能创建空的 Character(字符) 类型变量或常量:

// Swift 中以下赋值会报错
let char1: Character = ""
var char2: Character = ""
print("char1 的值为 \(char1)")
print("char2 的值为 \(char2)")
  • 遍历字符串中的字符
//Swift 3 中:
for ch in "Runoob".characters {
    print(ch)
}
//Swift 4 中:
for ch in "Runoob" {
    print(ch)
}
  • 字符串连接字符
    使用 String 的 append() 方法来实现字符串连接字符:
var varA:String = "Hello "
let varB:Character = "G"
varA.append( varB )
print("varC  =  \(varA)")
//以上程序执行输出结果为:
//varC  =  Hello G
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容

  •   Swift 的String和Character类型提供了快速和兼容 Unicode 的方式供你的代码使用。 字...
    CDLOG阅读 1,557评论 0 1
  • 字符串字面量 字符串字面量可以用于为常量和变量提供初始值: 多行字符串字面量 如果你需要一个字符串是跨越多行的,那...
    CoderLGL阅读 251评论 0 1
  • 字符的使用 您可通过for-in循环来遍历字符串,获取字符串中每一个字符的值: 另外,通过标明一个Characte...
    小驴拉磨阅读 605评论 0 0
  • Swift 的String类型是值类型。 如果您创建了一个新的字符串,那么当其进行常量、变量赋值操作,或在函数/方...
    皆为序幕_阅读 1,088评论 0 0
  • 1. 字符串 在 Swift 中 String 类型是值类型。 如果你创建了一个新的字符串,那么当其进行常量、变量...
    DevXue阅读 260评论 0 0