《swift2.0 官方教程中文版》 第2章-03字符串和字符


import Foundation


/*字符串字面量************************************************/

let someString = "Some string literal value"




/*初始化空字符串************************************************/

var emptyString = "" // 空字符串字面量

var anotherEmptyString = String() // 初始化方法 // 两个字符串均为空并等价。


if emptyString.isEmpty {

print("Nothing to see here")

}

// 打印输出:"Nothing to see here"




/*字符串可变性************************************************/

var variableString = "Horse"

variableString += " and carriage"

// variableString 现在为 "Horse and carriage"

let constantString = "Highlander"

//constantString += " and another Highlander"

// 这会报告一个编译错误 (compile-time error) - 常量字符串不可以被修改。


//注意:

// Objective-C Cocoa ,您需要通过选择两个不同的类( NSString NSMutableString )来指定字符串 是否可以被修改。




/*字符串是值类型************************************************/

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


//注意:

// Cocoa 中的 NSString 不同,当您在 Cocoa 中创建了一个 NSString 实例,并将其传递给一个函数/ ,或者赋值给一个变量,您传递或赋值的是该 NSString 实例的一个引用,除非您特别要求进行值拷贝,否则 字符串不会生成新的副本来进行赋值操作。

//在实际编译时,Swift 编译器会优化字符串的使用,使实际的复制只发生在绝对必要的情况下,这意味着您将字符 串作为值类型的同时可以获得极高的性能。




/*使用字符************************************************/

for character in "Dog!?".characters {

print(character)

}


//字符串可以通过传递一个值类型为 Character 的数组作为自变量来初始化:

let catCharacters: [Character] = ["C","a","t","!","?"]

let catString = String(catCharacters)

print(catString)

// 打印输出:"Cat!?"




/*连接字符串和字符************************************************/

//字符串可以通过加法运算符( + )相加在一起(或称连接”)创建一个新的字符串:

let string1 = "hello"

let string2 = " there"

var welcome = string1 + string2

print(welcome)

// welcome 现在等于 "hello there"


//您也可以通过加法赋值运算符 ( += ) 将一个字符串添加到一个已经存在字符串变量上:

var instruction = "look over"

instruction += string2

print(instruction)

// instruction 现在等于 "look over there"


//您可以用 append() 方法将一个字符附加到一个字符串变量的尾部:

let exclamationMark: Character = "!"

welcome.append(exclamationMark)

print(welcome)

// welcome 现在等于 "hello there!"

//注意:

//您不能将一个字符串或者字符添加到一个已经存在的字符变量上,因为字符变量只能包含一个字符




/*字符串插值************************************************/

//字符串插值是一种构建新字符串的方式,可以在其中包含常量、变量、字面量和表达式。 您插入的字符串字面量 的每一项都在以反斜线为前缀的圆括号中:

let multiplier = 3

let message = "\(multiplier) times 2.5 is \(Double(multiplier) * 2.5)"

print(message)

// message is "3 times 2.5 is 7.5"




/*Unicode************************************************/

let mmm = "\u{1F425}"

print("mmm is \(mmm)")


//字符串字面量可以包含以下特殊字符:

//转义字符 \0 (空字符) \\ (反斜线) \t (水平制表符) \n (换行符) \r (回车符) \" (双引号) \' (单引 )

//Unicode 标量,写成 \u{n} (u为小写),其中 n 为任意一到八位十六进制数且可用的 Unicode 位码。


//下面的代码为各种特殊字符的使用示例。 wiseWords 常量包含了两个双引号。 dollarSign blackHeart s parklingHeart 常量演示了三种不同格式的 Unicode 标量:

let wiseWords = "\"Imagination is more important than knowledge\" - Einstein" // "Imageination is more important than knowledge" - Enistein

print("wiseWords is \(wiseWords)")

let dollarSign = "\u{24}" // $,Unicode 标量 U+0024

print("dollarSign is \(dollarSign)")

let blackHeart = "\u{2665}" // ?,Unicode 标量 U+2665

print("blackHeart is \(blackHeart)")

let sparklingHeart = "\u{1F496}" // ?,Unicode 标量 U+1F496

print("sparklingHeart is \(sparklingHeart)")


let eAcute: Character = "\u{E9}" // é

let combinedEAcute: Character = "\u{65}\u{301}" // e 后面加上 ?

print("eAcute is \(eAcute)")

print("combinedEAcute is \(combinedEAcute)")


let precomposed: Character = "\u{D55C}" // ?

let decomposed: Character = "\u{1112}\u{1161}\u{11AB}" // ?,?,?

print("precomposed is \(precomposed)")

print("decomposed is \(decomposed)")


let enclosedEAcute: Character = "\u{E9}\u{20DD}"

print("enclosedEAcute is \(enclosedEAcute)")


let regionalIndicatorForUS: Character = "\u{1F1FA}\u{1F1F8}"

print("regionalIndicatorForUS is \(regionalIndicatorForUS)")




/*计算字符数量************************************************/

let unusualMenagerie = "Koala ?,Snail ?,Penguin ?,Dromedary ?"

print("unusualMenagerie has \(unusualMenagerie.characters.count) characters")

// 打印输出 "unusualMenagerie has 40 characters"


var word = "cafe"

print("the number of characters in \(word) is \(word.characters.count)")

// 打印输出 "the number of characters in cafe is 4"


word += "\u{301}" // COMBINING ACUTE ACCENT,U+0301

print("the number of characters in \(word) is \(word.characters.count)")

// 打印输出 "the number of characters in café is 4"




/*访问和修改字符串************************************************/

//你可以通字符串的属性和方法来访问和读取它,当然也可以用下标语法完成。

//每一个 String 值都有一个关联的索引(index)类型,String.Index,它对应着字符串中的每一个 Character 的位


//使用 startIndex 属性可以获取一个 String 的第一个 Character 的索引。使用 endIndex 属性可以获取最后一个 Character 的后一个位置的索引。因此,endIndex 属性不能作为一个字符串的有效下标。如果 String 是空串,startIndex endIndex 是相等的。

let aa = "indexes"

print("aa.startIndex is \(aa.startIndex)")

print("aa.endIndex is \(aa.endIndex)")


//通过调用 String.Index predecessor() 方法,可以立即得到前面一个索引,调用 successor() 方法可以立即 得到后面一个索引。任何一个 String 的索引都可以通过锁链作用的这些方法来获取另一个索引,也可以调用 ancedBy(_:) 方法来获取。但如果尝试获取出界的字符串索引,就会抛出一个运行时错误。

let greeting = "Guten Tag!"

greeting[greeting.startIndex]

// G

greeting[greeting.endIndex.predecessor()]

// !

greeting[greeting.startIndex.successor()]

// u

let index = greeting.startIndex.advancedBy(7)

greeting[index]

// a


//greeting[greeting.endIndex] // error

//greeting.endIndex.successor() // error

for index in greeting.characters.indices {

print("\(greeting[index]) ",terminator: "")

}

// 打印输出 "G u t e n T a g !"


//调用 insert(_:atIndex:) 方法可以在一个字符串的指定索引插入一个字符。

var welcome2 = "hello"

welcome2.insert("!",atIndex: welcome2.endIndex)

print(welcome2)

// welcome now 现在等于 "hello!"


//调用 insertContentsOf(_:at:) 方法可以在一个字符串的指定索引插入一个字符串。

welcome2.insertContentsOf(" there".characters,at: welcome2.endIndex.predecessor())

print(welcome2)

// welcome 现在等于 "hello there!"


//调用 removeAtIndex(_:) 方法可以在一个字符串的指定索引删除一个字符。

welcome2.removeAtIndex(welcome2.endIndex.predecessor())

print(welcome2)

// welcome 现在等于 "hello there"


//调用 removeRange(_:) 方法可以在一个字符串的指定索引删除一个子字符串。

let range = welcome2.endIndex.advancedBy(-6)..<welcome2.endIndex

welcome2.removeRange(range)

print(welcome2)

// welcome 现在等于 "hello"




/*比较字符串************************************************/

//字符串/字符可以用等于操作符( == )和不等于操作符( != )

let quotation = "We're a lot alike,you and I."

let sameQuotation = "We're a lot alike,you and I."

if quotation == sameQuotation {

print("These two strings are considered equal")

}

// 打印输出 "These two strings are considered equal"


//通过调用字符串的 hasPrefix(_:) / hasSuffix(_:)方法来检查字符串是否拥有特定前缀/后缀,两个方法均接收一 类型的参数,并返回一个布尔值。

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 1 Scene 4: A street outside Capulet's mansion",

"Act 1 Scene 5: The Great Hall 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",

"Act 2 Scene 4: A street in Verona",

"Act 2 Scene 5: Capulet's mansion",

"Act 2 Scene 6: Friar Lawrence's cell"

]


var act1SceneCount = 0

for scene in romeoAndJuliet {

if scene.hasPrefix("Act 1") {

++act1SceneCount

}

}

print("There are \(act1SceneCount) scenes in Act 1")

// 打印输出 "There are 5 scenes in Act 1"


var mansionCount = 0

var cellCount = 0

for scene in romeoAndJuliet {

if scene.hasSuffix("Capulet's mansion") {

++mansionCount

} else if scene.hasSuffix("Friar Lawrence's cell") {

++cellCount

}

}

print("\(mansionCount) mansion scenes; \(cellCount) cell scenes")

// 打印输出 "6 mansion scenes; 2 cell scenes"




/*字符串的 Unicode 表示形式************************************************/

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘贴.待开发的功能:1.支持自动生成约束2.开发设置页面3.做一个浏览器插件,支持不需要下载整个工程,可即时操作当前蓝湖浏览页面4.支持Flutter语言模板生成5.支持更多平台,如Sketch等6.支持用户自定义语言模板
现实生活中,我们听到的声音都是时间连续的,我们称为这种信号叫模拟信号。模拟信号需要进行数字化以后才能在计算机中使用。目前我们在计算机上进行音频播放都需要依赖于音频文件。那么音频文件如何生成的呢?音频文件的生成过程是将声音信息采样、量化和编码产生的数字信号的过程,我们人耳所能听到的声音频率范围为(20Hz~20KHz),因此音频文件格式的最大带宽是20KHZ。根据奈奎斯特的理论,音频文件的采样率一般在40~50KHZ之间。奈奎斯特采样定律,又称香农采样定律。...............
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿遍又亿遍,久久不能离开!看着小仙紫姐姐的蹦迪视频,除了一键三连还能做什么?突发奇想,能不能把舞蹈视频转成代码舞呢?说干就干,今天就手把手教大家如何把跳舞视频转成代码舞,跟着仙女姐姐一起蹦起来~视频来源:【紫颜】见过仙女蹦迪吗 【千盏】一、核心功能设计总体来说,我们需要分为以下几步完成:从B站上把小姐姐的视频下载下来对视频进行截取GIF,把截取的GIF通过ASCII Animator进行ASCII字符转换把转换的字符gif根据每
【Android App】实战项目之仿抖音的短视频分享App(附源码和演示视频 超详细必看)
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至2022年4月底。我已经将这篇博客的内容写为论文,上传至arxiv:https://arxiv.org/pdf/2204.10160.pdf欢迎大家指出我论文中的问题,特别是语法与用词问题在github上,我也上传了完整的项目:https://github.com/Whiffe/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset关于自定义ava数据集,也是后台
因为我既对接过session、cookie,也对接过JWT,今年因为工作需要也对接了gtoken的2个版本,对这方面的理解还算深入。尤其是看到官方文档评论区又小伙伴表示看不懂,所以做了这期视频内容出来:视频在这里:本期内容对应B站的开源视频因为涉及的知识点比较多,视频内容比较长。如果你觉得看视频浪费时间,可以直接阅读源码:goframe v2版本集成gtokengoframe v1版本集成gtokengoframe v2版本集成jwtgoframe v2版本session登录官方调用示例文档jwt和sess
【Android App】实战项目之仿微信的私信和群聊App(附源码和演示视频 超详细必看)
用Android Studio的VideoView组件实现简单的本地视频播放器。本文将讲解如何使用Android视频播放器VideoView组件来播放本地视频和网络视频,实现起来还是比较简单的。VideoView组件的作用与ImageView类似,只是ImageView用于显示图片,VideoView用于播放视频。...
采用MATLAB对正弦信号,语音信号进行生成、采样和内插恢复,利用MATLAB工具箱对混杂噪声的音频信号进行滤波
随着移动互联网、云端存储等技术的快速发展,包含丰富信息的音频数据呈现几何级速率增长。这些海量数据在为人工分析带来困难的同时,也为音频认知、创新学习研究提供了数据基础。在本节中,我们通过构建生成模型来生成音频序列文件,从而进一步加深对序列数据处理问题的了解。
基于yolov5+deepsort+slowfast算法的视频实时行为检测。1. yolov5实现目标检测,确定目标坐标 2. deepsort实现目标跟踪,持续标注目标坐标 3. slowfast实现动作识别,并给出置信率 4. 用框持续框住目标,并将动作类别以及置信度显示在框上
数字电子钟设计本文主要完成数字电子钟的以下功能1、计时功能(24小时)2、秒表功能(一个按键实现开始暂停,另一个按键实现清零功能)3、闹钟功能(设置闹钟以及到时响10秒)4、校时功能5、其他功能(清零、加速、星期、八位数码管显示等)前排提示:前面几篇文章介绍过的内容就不详细介绍了,可以看我专栏的前几篇文章。PS.工程文件放在最后面总体设计本次设计主要是在前一篇文章 数字电子钟基本功能的实现 的基础上改编而成的,主要结构不变,分频器将50MHz分为较低的频率备用;dig_select
1.进入官网下载OBS stdioOpen Broadcaster Software | OBS (obsproject.com)2.下载一个插件,拓展OBS的虚拟摄像头功能链接:OBS 虚拟摄像头插件.zip_免费高速下载|百度网盘-分享无限制 (baidu.com)提取码:6656--来自百度网盘超级会员V1的分享**注意**该插件必须下载但OBS的根目录(应该是自动匹配了的)3.打开OBS,选中虚拟摄像头选择启用在底部添加一段视频录制选择下面,进行录制.
Meta公司在9月29日首次推出一款人工智能系统模型:Make-A-Video,可以从给定的文字提示生成短视频。基于**文本到图像生成技术的最新进展**,该技术旨在实现文本到视频的生成,可以仅用几个单词或几行文本生成异想天开、独一无二的视频,将无限的想象力带入生活
音频信号叠加噪声及滤波一、前言二、信号分析及加噪三、滤波去噪四、总结一、前言之前一直对硬件上的内容比较关注,但是可能是因为硬件方面的东西可能真的是比较杂,而且需要渗透的东西太多了,所以学习进展比较缓慢。因为也很少有单纯的硬件学习研究,总是会伴随着各种理论需要硬件做支撑,所以还是想要慢慢接触理论学习。但是之前总找不到切入点,不知道从哪里开始,就一直拖着。最近稍微接触了一点信号处理,就用这个当作切入点,开始接触理论学习。二、信号分析及加噪信号处理选用了matlab做工具,选了一个最简单的语音信号处理方
腾讯云 TRTC 实时音视频服务体验,从认识 TRTC 到 TRTC 的开发实践,Demo 演示& IM 服务搭建。
音乐音频分类技术能够基于音乐内容为音乐添加类别标签,在音乐资源的高效组织、检索和推荐等相关方面的研究和应用具有重要意义。传统的音乐分类方法大量使用了人工设计的声学特征,特征的设计需要音乐领域的知识,不同分类任务的特征往往并不通用。深度学习的出现给更好地解决音乐分类问题提供了新的思路,本文对基于深度学习的音乐音频分类方法进行了研究。首先将音乐的音频信号转换成声谱作为统一表示,避免了手工选取特征存在的问题,然后基于一维卷积构建了一种音乐分类模型。
C++知识精讲16 | 井字棋游戏(配资源+视频)【赋源码,双人对战】
本文主要讲解如何在Java中,使用FFmpeg进行视频的帧读取,并最终合并成Gif动态图。
在本篇博文中,我们谈及了 Swift 中 some、any 关键字以及主关联类型(primary associated types)的前世今生,并由浅及深用简明的示例向大家讲解了它们之间的奥秘玄机。