iOS Swift基础语法(二)

2、基本数据类型

这里介绍一下Swift的基本数据类型:整数、浮点数、布尔型、可选型和元组,其它较复杂的后面再介绍。Swift中的数据类型的首字母都是大写的。

2.1、整数

整数的定义为没有小数部分的数字,可以带有正负号,Swift提供了IntUInt两种整数类型,分别表示有符号和无符号的整数类型。在IntUInt后面可以带有数字8、16、32和64,以表示8、16、32、64位的整数。另外,整数类型都有属性maxmin,分别表示不同整数类型的最大值和最小值,在Swift中访问属性采用“点方法”。

Int8 与 UInt8 类型

2.2、浮点数

浮点数是指有小数部分的数字,比如3.1415926。Swift提供了两种浮点数类型:FloatDouble,Float表示32位浮点数,而Double表示64位浮点数,选择哪种类型的浮点数取决于你对精度的要求。

2.3、布尔型

Swift提供了一个非真即假的逻辑类型--布尔类型(Bool)。布尔类型有两个常量:truefalse。需要注意的是,Swift中的布尔类型不同于OC中的BOOL类型,不再接受0代表false、1代表true的用法,如下代码所示。

//正确
if true {
    let num = 1
}
//错误
if 1 {
    let num = 1
}
2.4、元组类型

元组是Swift中非常好用的一个数据类型,它可以把多个值成员复合成一个值,并且这些成员的数据类型可以不同,把成员值放到一个括号中,以逗号分隔。比如一个学生的身份信息:

let message = ("小傅","18","高三一班")

这个元组类型就可以表达出一个高三一班名叫小傅的18岁同学,结构非常精简。元组中的每个成员值都有一个默认的索引,我们可以通过索引直接获取元组中各部分的值,比如:

let name = message.0
let age = message.1
let grage = message.2

playground中显示如图2.4所示

图2.4

我们可以自定义每个成员变量的名字,格式为(成员名称1:成员值1,成员名称2:成员值2,······),调用的时候可以使用名称调用:

let message2 = (name:"小傅",age:"18",grade:"高三一班")
let name2 = message2.name
let age2 = message2.age
let grade2 = message2.grade

另外,如果想要获取元组中的某些重要部分加以利用,忽略一些不重要的信息时,可以把元组的值传递到一个新的元组中,在新元组中声明那些接受重要值的值成员,而不重要的使用下划线“_”表示忽略。例如上例中,只关心学生信息的学生姓名,那么可以使用下面的语句,元组中的成员可以直接当作常量和变量使用:

let (showName,_,_) = message2
print("Name is \(showName)")
2.5、可选型

可选型用于某些不确定是否有值的情况,其有两个返回值:具体的值和nil,nil表示空值。OC中没有可选型这种数据类型,可选型是Swift都有的。定义可选型只需在常规类型后面加一个问号?即可,例如:

var age : Int?

这样,age就被定义成一个可选型,如果它有值,就一定会返回一个Int类型的值,否则返回nil。可选型经常被用作搜索或者转型方法的返回值类型,这是因为在搜索和转型中经常出现失败的情况。介绍一个转型的例子,在Swift中,String类型可以和Int类型的实例相互转换,你可以把诸如"12"这样的字符串转换成Int,但是不能转换“小明”这样的字符串,Swift风格的转型使用构造器。如图2.5所示。

图2.5

值得注意的是,age在定义为Int类型的可选型之后被赋予了一个默认的初始值nil,这也是可选型的一个好处之一。 看一下下面的代码:

var age : Int?
age = Int("12")
print("age is \(age)")

你可能认为代码第三行应该输出的应该是“age is 12”,但是实际情况并不是这样,如图2.6所示。

图2.6

在输出语句中我们得到的age的值显示为Optional(12),Optional代表可选,age的当前值为一个整数类型的可选型。在实际开发中我们真正需要的是括号中的12,想要获取这个12,就需要使用“解包”操作。 解包是针对于可选类型的变量操作,当我们确定一个可选型的值不为nil的时候,可以使用解包获取其中的值。它的表现形式也非常简单,在需要进行解包的变量名后面加上一个感叹号。现在对age变量进行解包,效果如图2.7所示。

图2.7

最后需要指出的是,声明一个可选型虽然可以通过编译器设置的安全性检查,但是如果你不慎忘记在之后对其赋值,那么在解包的时候程序就会崩溃。所以我们在声明一个对象的时候,尤其是声明类或者结构体的属性的时候,应该三思而后行,尽可能为其赋初始值,当然这个初始值应该是明显区别于正常值的。再把可选型转换成非可选型的赋值语句中经常用到“??”操作符,“??”之前为一个可选型,“??”之后为一个非可选型的值。“??”操作符自带解包功能,在赋值时“??”会检查其之前的可选型:如果可选型不为nil,则将其解包并返回;如果其为nil,则不会返回nil,则此时返回“??”之后的非可选型的值。使用“??”改造上面的代码,如下所示:

var age:Int //这里避免解包,声明age为非可选型
age = Int("12") ?? -1
print("age is \(age)") //转型成功
age = Int("小明") ?? -1
print("age is \(age)") //转型失败

运行结果如图2.8

图2.8 “??操作符”

由于在真实的数据环境中年龄不可能为负数,此时当我们看到age为-1的时候就知Int(String)转型失败了。 Swift提供了一种更安全的解包方式:可选绑定。可选绑定有两种格式可选:if-letguard-let-else。首先来看if-let结构:

var age:Int? = Int("12")
if let a = age {
    print(a)
}

类似于if语句,当age不为空的时候,对age解包并给其一个“别名”a,在if后的大括号中对a才有效果,此时a的值为12,已经解包。如果agenil,那么大括号中的代码不会执行,使用可选解包程序不会崩溃。guard-let-elseSwift2.2新引入的格式,示例如下:

var age:Int? = Int("12")
func findA() {
    guard let a = age else {
        print("终止方法")
        return //终止方法
    }
    print(a) //在外部使用解包后的值
}

不同于if-let,guard-let-else首先处理agenil的情况,在此种情况中必须在大括号中使用return或者break提前终止代码。这里不管有多少个guard-let-else,别名a的作用域都在最外层,有效地避免了过于深入的嵌套。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏芋道源码1024

深入解析Java反射(1) - 基础

> https://www.sczyh30.com/posts/Java/java-reflection-1/ ? 排版有点点崩嘿

9740
来自专栏MasiMaro 的技术博文

C函数原理

C语言作为面向过程的语言,函数是其中最重要的部分,同时函数也是C种的一个难点,这篇文章希望通过汇编的方式说明函数的实现原理。

14730
来自专栏marsggbo

python的with语句,超级强大

With语句是什么? 有一些任务,可能事先需要设置,事后做清理工作。对于这种场景,Python的with语句提供了一种非常方便的处理方式。一个很好的例子是文...

217100
来自专栏web编程技术分享

【PHP快速入门】 第二节 php基本语法1.什么地方能写PHP代码?2.PHP语句要不要加分号?3.如果本来该加分号的地方我没加怎么办?4.PHP有注释吗?5.PHP变量怎么去定义的?5.PHP

有的地方要加,有的地方不要加。(似乎是废话...) 一句话搞定:有花括号的地方不要加,其他都给我加上!! 比如,if判断,for循环,定义方法,这些都不要加...

15320
来自专栏java一日一条

Java字符串之性能优化

在程序中你可能时常会需要将别的类型转化成String,有时候可能是一些基础类型的值。在拼接字符串的时候,如果你有两个或者多个基础类型的值需要放到前面,你需要显式...

9920
来自专栏华章科技

Python 3 入门,看这篇就够了

链接:https://shockerli.net/post/python-study-note/

47060
来自专栏mukekeheart的iOS之旅

OC学习10——内存管理

1、对于面向对象的语言,程序需要不断地创建对象。这些对象都是保存在堆内存中,而我们的指针变量中保存的是这些对象在堆内存中的地址,当该对象使用结束之后,指针变量指...

24250
来自专栏java一日一条

基础类型转化成String

在程序中你可能时常会需要将别的类型转化成String,有时候可能是一些基础类型的值。在拼接字符串的时候,如果你有两个或者多个基础类型的值需要放到前面,你需要显式...

9520
来自专栏增长技术

Swift体验2

使用if和switch做条件判断,使用for-in,for,while,do-while做循环 操作。括号中的条件或循环变量是可选的。括号的身体是必需的。

13330
来自专栏玄魂工作室

《改善C程序代码的125个建议》-防止整数类型产生回绕与溢出

以下内容摘抄自《改善C程序代码的125个建议》: 建议2:防止整数类型产生回绕与溢出 到C99为止,C语言为我们提供了12个相关的数据类型关键字来表达各种数据...

31870

扫码关注云+社区

领取腾讯云代金券