一个下午让你掌握Swift基础 ( 4/9 ) 字符串

简介

这是一个Swift语言教程,基于最新的iOS 9,Xcode 7.3和Swift 2.2,会为你介绍Swift编程非常基础的内容。从电脑如何工作的全程基本原理到语言结构,你会足够了解这门语言,来处理数据和管理代码的行为。

快速链接


数字是编程的基本要素,但他们不是你的apps里唯一需要的数据类型。文本(Text)也是一种非常常见的数据类型—人名;他们的地址;一本书的文字。这些都是app里可能需要用到文字的例子。

大部分电脑编程语言用一个叫做string的数据类型来存储文字。这篇文章为你介绍strings(字符串),首先介绍一下字符串的背景概念,然后展示一下在Swift里怎么使用它们。

计算机如何表示字符串

电脑认为字符串是单独字符(characters)的集合(collection)。在这个教程的第一篇文章里,你知道了CPU的语言就是数字,并且所有代码,不论是什么编程语言,最后都会变成数字。字符串也一样!

听起来可能很奇怪。字符怎么可以是数字呢?一台最基本的计算机需要能够把一个字符翻译到计算机自己的语言,通过给每个字符分配一个不同的数字。这形成了一个双向转换,从字符到数字,叫做字符集(character set)

在你用键盘按下一个字符的按键的时候,实际上在用字符的数字和电脑交流。你的文字处理应用程序把数字转换到对应字符的图片,然后最终把图片显示给你。

Unicode

在电脑互相孤立的情况下,电脑可以随便选择用它喜欢的那个字符集来转换。如果电脑想要字母 a 等于数字10,那就这样咯。但当计算机之间开始对话后,他们需要一个通用字符集。如果两个电脑使用不同的字符集,然后一台电脑传输一个字符串给另一个的时候,他们最终会认为字符串包含了不同的字符。

所以,一个标准诞生了:Unicode。它定义了当今几乎所有电脑转换字符集。

注意:你可以在官网上了解更多Unicode相关,http:// unicode.org/

举个例子,想想单词 cafe。Unicode标准告诉我们这个单词的字母应该像这样转换到数字:

和每个字符对应的数字叫做代码点(code point)。所以在上面的例子里,c 使用代码点99,a 使用代码点97,以此类推。

当然,Unicode不只有简单的英语里的拉丁字符,比如 cafe。它也可以让你从世界其他语言里转换字符。

单词cafe,你应该也知道,它起源于法语,在法语里被写作café。Unicode像这样转换字符:

这是用中文字符的例子:

你也听过emoji吧,由小图片组成,可以在文本里使用。这些图片实际上就是普通的字符,也可以被Unicode转换。例如:

这只是两个字符。这些的代码点数字都很大,但每个也只是单独的代码点。电脑认为他们和其他任何两个字符都没有什么不同。

注意:“emoji”单词来自日语,“e”表示图片,“moji”表示字符。

Swift里的字符串

Swift,和任何优秀的编程语言一样,可以直接处理字符和字符串。通过数据类型Character和String来分别实现。这个教程里,你会学习有关这些数据类型以及如何使用它们。

字符和字符串

Character数据类型可以存储一个单独的字符。例如:

let charaterA: Charater = "a"

它存储了字符 a。它可以保存任意字符——甚至是一个emoji:

let charaterDog: Character = "🐶"

但这个数据类型只被设计用来存储单个字符。另一个String数据类型,用来存储多个字符。例如:

let stringDog: String = "Dog"

就这么简单!右边的表达式被称作字符串字面值(string literal),Swift的语法,用来表示一个字符串。

let stringDog = "Dog" // 这是一个String

串联

你不止能创造简单的字符串。有时候你需要串联字符串,一个常规方式就是把它和另一个字符串组合起来。

Swift里,你可以相当简单地完成,使用加法操作符。就像你让数字相加那样,也可以让字符串相加:

var message = "Hello" + "my name is "

let name = "Matt"
message += name // "Hello my name is Matt"

你需要声明message为变量而不是常量,因为你想要修改它。你可以把字符串字面值加起来,就像第一行里,你也可以把字符串变量或常量加起来,就像最后一行。

把字符添加到字符串也是可能的。但是,Swift的类型严格意味着你在这么做的时候要显示声明,就像把Int和Double类型的数字加在一起的时候那么做。

要把一个字符加到字符串,你要这样做:

let exclamationMark: Character = "!"
message += String(exclamationMark) // "Hello my name is Matt!"

显示转换Character到String的时候,要把这个代码加到message之前。

插入

你也能用插入(interpolation)来创建一个字符串,这是一个特殊的Swift语法,允许你用一种容易读的方式来建立字符串:

let name = "Matt"
let message = "Hello my name is \(name)!" // "Hello my name is Matt!"

我想你也会同意,这比之前部分的例子可读性要强多了。这是字符串字面值语法的扩展,你用其他值来替换字符串里指定的部分。把想给字符串的值用括号围绕起来,前面再放一个反斜线。

从其他数据类型来创建字符串的语法也相同,比如数字:

let oneThird = 1.0 / 3.0
let oneThirdLongString = "One third is \(oneThird) as a decimal."

你在这儿的插入用了Double。在这行代码的结尾,你的oneThirdLongString会包含如下:

One third is 0.3333333333333333 as a decimal.

当然,它实际上会有无限个字符来用实数表示三分之一,因为它是一个循环小数。Double的字符串插入让你没有方式来控制结果字符串的精度。

这是使用字符串插入的一个不幸结果;使用起来很简单,但没有提供自定义输出的能力。

相等和其他方法

有时候你想要判断两个字符串是否相等。例如,一个儿童游戏,命名照片里的动物,会需要判断选手回答是否正确。

Swift里,你可以使用标准相等操作符来比较字符串,==,和比较数字的方式完全相同。例如:

let guess = "dog"
let dogEqualsCat = guess == "cat"

这里,dogEqualsCat是一个布尔型,这个情况中等于false,因为“dog”不等于“cat”。简单!

和数字一样,你不止能比较相等性,还能判断一个值是大于或小于另一个值。例如:

let order = "cat" < "dog"

这个语法检查一个字符串在字母表里是不是在另一个之前。这个情况中,order等于true,因为“cat”在“dog”前面。

相等的话题带出了Unocide的一个有趣特色:有两种方式表示一些字符。一个例子是 café 里的 é,带有闭音符(acute accent)的 e。你可以用一个单独的字符或两个字符来表示它。

你在这篇文章之前看到了那个单独的字符,代码点233。双字符例子是一个单独的e,紧跟着一个闭音符组合字符(combining character),是一个特殊字符,可以修改前一个字符。

所以你可以通过这两种方式来表示带有一个闭音符的 e。

第二个示意图里这两个字符的组合被称作字形簇(grapheme cluster)

组合字符的另一个例子是用来改变指定emojis的皮肤颜色的特殊字符。例如:

这里,emoji向上大拇指紧跟着一个皮肤色调的组合字符。在支持它的平台上,包括iOS和Mac OS X,给出的emoji是一个单独的图像,向上大拇指字符但是应用了皮肤色调。

组合字符让字符串的相等性有一点棘手。例如,想想单词 café 一个是用单独 é 字符写的,一个使用了组合字符,像这样:

这两个字符串逻辑上当然是相等的。当他们被打印到屏幕上,看起来完全相同。但电脑内部却用了不同的方式表示。很多编程语言会认为这些字符串不相等,因为这些语言一个接一个比较字符。

但是,Swift认为这些字符串默认是相等的。让我们实际行动来看看:

let stringA = "café"
let stringB = "cafe\u{0301}"

let euqal = stringA == stringB

注意:在上面的代码里,闭音符组合字符是用Unicode简写来写的,用\u后面跟上十六进制代码点,在花括号里。你可以用这个简写来写任意Unicode字符。我在这儿必须要这样做的原因是我没有办法在键盘上打出这个组合字符!

这个例子里,equal是true,因为两个字符串逻辑上是相同的。

Swift里的字符串比较使用一个叫做标准化(canonicalization)的技术。快速把它的英文念三遍!在检查相等之前,Swift会标准化两个字符串,意味着他们被转换到使用相同特殊字符表示。

无所谓用哪种方式完成标准化——用单独字符还是用组合字符——两个字符串已经都被转换到相同的形式了。一旦标准化完成了,Swift可以比较单独的字符来检测相等性。

在计算字符串里有多少字符的时候,标准化也发挥了同样的作用。让我们看看吧:

let stringA = "café"
let stringB = "cafe\u{0301}"

stringA.characters.count
stringB.characters.count

这段代码的最后两行得到了stringA和stringB的字符个数。

这是访问一个对象的property的语法,这是你在这个教程里第一次看见它。但现在,你不需要理解任何事,只要知道这几行能够得到字符数量。

这里,字符数量都是4,即使第二个字符串是由五个代码点组成的。 这是因为代码计算他们会显示在屏幕上的字符——其实就是计算字符簇的数量。

最后,Swift可以轻易创建大小和小写字符串,很好用。像这样做:

let string = "I can learn Swift basic in an afternoon!"

结果如下:

I CAN LEARN SWIFT BASIC IN AN AFTERNOON! i can learn swift basic in an afternoon!

再说一次,这句代码使用了访问字符串property的句法。你会在接下来的文章学习更多关于property的内容。但现在,只要知道Swift里有很多方式来操作字符串。

迷你练习

  1. 创建一个字符串常量叫做firstName,然后用你的名字来初始化它。再创建一个字符串较量叫做lastName,初始化为你的姓。
  2. 创建一个字符串常量叫做fullName,通过把firstName和lastName常量加起来,中间空一格空格。
  3. 使用插入,创建一个字符串常量用fullName常量来创建一个字符串介绍一下你自己,叫做myDetails。例如,我的字符串会这么写:“Hello, my name is Jiafu Zhang.”。

关键点

  • Unicode是把字符转换到数字的标准。
  • Unicode里一个单独的转换叫做代码点(code point)
  • Character数据类型存储单独的字符。
  • String数据类型存储字符集合,或字符串。
  • 你可以用加法操作符来组合字符串。
  • 你可以使用字符串插入(string interpolation)按原样创建字符串。
  • Swift标准化(canonicalization)的使用保证了使用组合字符的字符串的比较。

接下来去哪儿?

数字、布尔型和字符串是Swift里基本数据类型。最近的几篇文章里你已经读到了全部关于数据类型和存储数据的内容;现在是时候回到代码本身了!

在接下来的两篇文章里,你会学习如何使用所有这些你现在知道的数据以及如何存储它们。有了控制流和重复步骤,你就能让代码决定在数据上何时以及做一件事多少次。

挑战

A挑战:你就是编译器

下列哪个是有效状态?

let character: Character = "Dog"
let character: Character = "🐶"
let string: String = "Dog"
let string: String = "🐶"

下面的代码错在哪里?

let name = "Matt"
name += "Galloway"

B挑战:结果预测

那个叫做sum的常量值是多少?

let value = 10
let multiplier = 5
let sum = "\(value) multiplied by \(multiplier) equals \(value * multiplier)"

介绍

欢迎来到Swift世界!Swift是一门苹果在2014年夏天发布的编程语言。从那之后,Swift发布了一个主要的版本跳跃,成为了开始在苹果平台:iOS,OS X,watchOS和tvOS开发的最简单的方式。

谁适合这篇教程

这篇教程适合懂一点编程、并且希望学习Swift的人。也许你已经为网站写过一些JavaScript代码,或者用Python写过一些简短的程序。这篇教程就是为你准备的!你会学习到编程的基本概念,同时也会成为Swift语言小能手。

如果你是赤裸裸的编程新手,这篇教程也是为你准备的!教程里贯穿有简短的锻炼和挑战来给你一些编程练习,同时测试你的知识。

需要准备什么

要看这篇教程,你需要准备如下的东西:

  • 一台运行OS X El Captian(10.11)的Mac,带有最新发布的更新并且安装了安全补丁。这样你才能够安装需要的开发工具:最新版本的Xcode。
  • Xcode 7.3或更新的版本。Xcode是用Swift写代码的主要开发工具。最小也需要Xcode 7.3版本,因为那个版本包含Swift 2.2。你可以免费从Mac App Store下载Xcode的最新版本,这里:http://apple.co/1FLn51R

如果你还没有安装Xcode最新版本,在继续看下面的教程前要确定安装。

如何使用这篇教程

每篇教程都会介绍触手可及的话题理论,伴随大量Swift代码来示范在学习的实际的应用程序。

教程里的所有代码都是平台中立的;这意味着不是为iOS、OS X或任何其它平台而特定。代码在playgrounds里运行,你在本篇中已经学习了。

在剩下的教程里,你可以把代码在自己的playground里输入进去。这样你就可以和代码“玩耍”(play around),做一些改变立即就能看见代码运行的结果。

剩下的教程里会贯穿实际小练习,都是简短的练习,关于触手可及的主题。每篇的末尾也有挑战,会有编程问题也会有长一点的代码练习来测试你的知识。做完就能掌握大部分的Swift基础知识。

教程更新

教程会随Swift语言的更新而更新,会发布在我的简书和知乎专栏上,搜索“张嘉夫”即可关注我。

目录

本教程从一些基础工作开始来让你起步:

  • 第1篇,编程本质 & Playground基础 - 这就是,到编程世界的入门介绍!你会从电脑和编程的预览开始,然后剩余时间给Swift playground打个招呼。
  • 第2篇,变量 & 常量 - 你会学习到变量和常量,这是用来存储数据的“地方”。你也会学习数据类型以及Swift如何追踪数据类型并在代码中进行传输。
  • 第3篇,数字类型 & 操作 - 你会从基础的数字类型比如整形和浮点型数字开始,当然也包括布尔类型。也会看到一些在实际操作,从比较到算数操作如加减。
  • 第4篇,字符串 - 用字符串来存储文字-从按钮里的文字到图片的标注到这篇教程全部的文字,存储这所有的一切!你会学习到string和character类型,以及基于这些类型的一些常见操作。

在脑海中有基础数据类型后,就该用那些数据做一些事情了:

  • 第5篇,做判断 - 代码不总是直接从头运行到尾。你会学习在代码里如何做判决并且设定情况来运行某段代码。
  • 第6篇,重复步骤 - 继续不要让代码直线运行的主题,你会学习到如何使用循环来重复某些步骤。
  • 第7篇,函数 - 函数是Swift中用来构建代码的基础建筑。你会学习到如何定义函数来分组代码到可复用单元中。
  • 第8篇,闭包(Closures) - 闭包和函数很接近。你会学习到如何使用它们来轻松传递代码块。

最后一篇会回到数据:

  • 第9节,可选值 - 这篇讲可选值,Swift中的一种特殊类型,表示既有可能是一个真实的值也有可能没有值。这篇的最后你会知道为什么要用可选值以及如何安全地使用它们。

这些基础会让你快速开始Swift之路,做好接触更高级编程主题的准备。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,026评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,655评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,726评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,204评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,558评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,731评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,944评论 2 314
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,698评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,438评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,633评论 2 247
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,125评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,444评论 3 255
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,137评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,103评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,888评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,772评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,669评论 2 271

推荐阅读更多精彩内容