4. 更多类型

转载自http://wanwu.tech/2017/03/05/types/
我们已经学习了基本的数据类型及其使用方法,也知道了我们有什么运算符可用。如同上一章的问题,我们知道了怎么表达有两个苹果,但是怎么表达我的名字叫小明呢?

这个时候,我们就涉及到了新的数据类型:字符串。这一章,我们首先会介绍什么是数据类型,然后介绍更多数字相关知识和字符串。

数据类型

数据类型是一种属性,用于指定数据的种类,比如我们上一章介绍的整数、浮点数。一个数据,有数据类型,同时也有一个相应的名称和值(或者属性)。上一章中,下面的代码创建了一个数据类型为Int,名称为numberApple,值为10的数据。

let numberApple: Int = 10

类似的,下面的代码创建了数据类型为Double,名称为price,值为5.2的数据。

let price: Double = 5.2

类型推断

现在,看一下我们的代码

let numberApple: Int = 10
let price: Double = 5.2

如果我按下面这样写(不指明数据类型),你能猜出来两个数据分别是什么数据类型吗?

let numberApple = 10
let price = 5.2

提示:根据等号右边的数据有没有小数点来判断

相信大家都可以猜出来吧?Swift也能!这个猜测的过程叫做类型推断

那么,我们如果想确定Swift的推断是否符合我们的心意怎么办呢?一个方法是点击右上角面板控制器的

,使其成蓝色激活状态,打开右边框。鼠标点击想要查看的变量或者常量的位置,右边栏会出现其具体信息。或者也可以按住Option键,鼠标点击,也可看到弹出框显示具体信息。

那么什么时候可以使用类型推断什么时候不行呢?一般来说你能猜出来,Swift就能猜出来。你猜不出来,Swift也难猜出来。

数据类型转换

接下来,我们如果想对价格(price)取整呢?可以这样吗?

let price: Double = 12.5
var priceInteger: Int = 0
priceInteger = age

我们的Playground会报错:

Cannot assign value of type 'Double' to type 'Int'。

并且会有修改建议:

Fix-it Replace "price" with "(Int)price"。

双击接受这条建议,我们发现,代码变为了:

priceInteger = Int(price)    // => 12


以上发生了什么事情呢?开始的报错,因为Swift不允许你将一个“Double”数据隐式(悄悄地,不公开说明)地转变为“Int”。推荐的修改建议是说,你要显式(公开)地说明,你想把“Double”转变为“Int”。


为什么呢?我们的price值为5.2,那么它转为“Int”后,小数怎么处理呢?如果采用显式转换Int(age),Swift如同得到了你的授权,它将把小数直接忽略。但是如果反过来,“Int”转为“Double”呢?

price = priceInteger

我们发现,还是不行!,因为swift是一门强类型语言,它不允许任何隐式的数据转换


所以上面代码必须改为:

price = Double(priceInteger)

由以上两个例子,我们可以总结出,如果进行数据转换的话,其形式应该是:

目标数据类型的数据 = 目标数据类型(待转换数据)

操作多种数据类型

我们已经知道了苹果的数量,如果我们再知道苹果的单价,那么我们就可以计算出苹果的总价了吧:

let numberApple: Int = 10
let price: Double = 5.2
let totalPrice: Double = numberApple * price

Playground中尝试,你应该会发现报错:

Binary operator '*' cannot be applied to operands of type 'Double' and 'Int'

这是为什么呢?因为numberApple是“Int”数据,而price是“Double"数据,不是一种类型。如果要计算,必须将他们转变为同一种数据类型。如果你想要结果为“Int”,那么就把price转变为“Int”再做计算。这里,我们的totalPrice是“Double”,所以我们应该将numberApple转为“Double”:

let numberApple: Int = 10
let price: Double = 5.2
let totalPrice: Double = Double(numberApple) * price

小练习

将上面计算总价的代码片段使用类型推断重写,并使用介绍的两种方法查看其推断类型。

字符串

在本章开始,我们要解决怎么表达我的名字叫小明的问题。这个时候,就轮到字符串String)数据类型出场了。

字符串定义

let name = "xiaoming"
let name2 = "小明"

上面的代码定义了两个名字,一个英文是“xiaoming”,另一个是中文的“小明”。等号左边的部分叫做字符串字面值,使用双引号括起来。

很明显,上面的代码我们靠类型推断来判断出以上两个常量是字符串,那么如果我们想显式声明呢,我们可以这样:

let name:String = "xiaoming"
let name2: String = "小明"

字符串操作

如果我们想要把名字分成“姓”和“名”分开存储,但是一起显示,可以怎么做呢,我们可以尝试下面方法把两个字符串用加号”+“加起来:

let firstName = "Meimei"
let lastName = "Han"
let fullName = firstName + lastName
print(fullName)

我们注意到这个方法是可行的,但是有一个人问题,英文的“姓”和“名”需要中间有空格,怎么办呢?我们中间加一个空格试试:

let fullName = firstName + " " + lastName


现在我们通过print(fullName)方法来打印全名,但是如果我想表达更完整信息呢,比如“我的名字叫某某,身高XXX”怎么办?

let firstName = "Meimei"
let lastName = "Han"
let height: Double = 1.72
let fullName = firstName + " " + lastName
print("My name is " + firstName + " and my height is " + String(height))

上面代码我们除了使用字符串相加,还使用了类型转换,将一个“Double”型常量转为了“String”。

但是有一个问题,你看双引号看晕了吗?说实话,写多了我已经有点晕了。那怎么办呢?试试下面方法:

print("My name is \(firstName) and my height is \(height)")

这里,我们使用了字符串插值的方法,大大简化了代码的书写,提高了可读性。值得注意的是,这里我们在做插值的时候,数字直接转为了字符串。

总结

  1. 更过数字类型的操作
  2. 类型转换
  3. 字符串基本操作

下一步

韩梅梅已经是一个大美女了,那么如果李雷还和她在一起,他们应该结婚了吧?(90,00后有兴趣可以百度韩梅梅和李雷的故事,我也想写你们的故事,但是我不知道啊。。。)

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

推荐阅读更多精彩内容