swift语言学习-3. 基本数据类型

前言:

这一节是蛮重要的基础部分,主要讲解swift的基本数据类型,就像c语言,php语言一样。很重要。我们开始讲。

swift的语言特点和C语言有点像。但是,可以不用写main() 函数,单条语句后面,可以不用分号( ; )。


1. 变量和常量

php中申明变量很简单,直接 $foo = 123; $foo = 'phper'; $foo = array(1,2,3); 就可以了。不用管申明的是什么数据类型。但是C语言不一样,你申明一个变量,必须要指明申明的变量是什么类型:int foo = 123; int foo[] = {1,2,3}; char foo = "e"; swift 由于是C语言的衍生品,所以也是这样定义的,但是是和 js 很像的风格:

1.1 用 var 关键字来申明一个变量,格式为: var 变量名 :类型 = 值; 变量是指可以随意改变的量。但是,只能申明定义一次,可以多次改动。

var foo:Int = 1234 //整型
var foo2:String = "qwer" //字符串
var foo3:[String] = ["Eggs", "Milk"] //数组

我们看看其他语言中是怎么申明变量的,可以对比一下:

//php
$foo = 1234;
$foo2 = "qwer";
$foo3 = array("Eggs", "Milk");

//c语言
int foo = 1234;
char foo2 = "qwer";
char foo3[] = {"Eggs","Milk"};

//javascript
var foo = 1234;
var foo2 = "qwer";
var foo3 = ["Eggs","Milk"];

1.2 用 let 申明一个常量,格式为:  let 常量名:类型 = 值;常量定义一次,以后不能改变了。也是不能重复多次申明。


let con1:Int = 1234 // 整型
let con2:String = "qwer" // 字符串
let con3:[String] = ["Eggs", "Milk"] //数组

同样,我们看其他语言中怎么申明变量的:

//php php定义常量使用define函数
define('CON1', 1234);
define('CON2', "qwer");
define('CON3', array("Eggs", "Milk"));

//c语言 c语言使用const 定义常量
const int con1 = 1234;
const char con2 = "qwer";
const char con3[] = {"Eggs", "Milk"};

//javascript
//js无法自定义常量, 你可以使用全局变量代替
var PI=3.14;

1.3 省略变量类型

我们在swift中,其实是可以像php和javascript那样不用申明变量类型的,程序会帮我们自动识别它是什么变量类型,有点弱语言的特点了,这点很赞,所以我们就可以像下来这样只有var 和 let 来申明变量和常量了:

var foo1 = 123 //自动识别为Int型 变量
var foo2 = "qwer" //自动识别为 String型 变量
var foo3 = ["Eggs", "Milk"] //自动识别为数组类型 变量
let foo1 = 123 //自动识别为Int型 常量
let foo2 = "qwert" //自动识别为 String型 常量
let foo3 = ["Eggs", "Milk"] //自动识别为数组类型 常量


2. 常量和变量的命名

变量和常量的命名,比C语言要爽,和PHP一样,你可以用任何你喜欢的字符作为常量和变量名,包括 Unicode 字符:
let π = 3.14159
let 你好 = "你好世界"

常量与变量名不能包含数学符号,箭头,保留的(或者非法的)Unicode 码位,连线与制表符。也不能以数字开头,但是可以在常量与变量名的其他地方包含数字。

一旦你将常量或者变量声明为确定的类型,你就不能使用相同的名字再次进行声明,或者改变其存储的值的类型。同时,你也不能将常量与变量进行互转。


3. 输出变量和常量

在c语言中,我们通常使用printf("%d", foo) 这样格式控制输出的方式来打印变量和常量。在swift里,我们用java里常用的print()和 println() 函数来输出任何变量。它更强大和方便。我们一般用println() 打印并换行。

1. println("qwer"); //直接打印变量,必须用双引号

2. println(12345); //直接打印整形。

3. println("print info is: \(foo)"); // 使用 \(变量名) 这样方式来解析变量,混合打印输出。


4. 注释

swift中的注释和其他语言一样,主要是这两种,也是主要的两种:

1. // 双斜杠,单行注释
2. /* 多行 */  多行注释

5. 分号

swift中和其他语言一样,每一行的结尾用分号表示结束,但是,也可以不用,并且推荐不用分号(ps. 操,最jb讨厌这种不用分号结束的语言。)。但是,一句单独占一行的时候,可以不用,如果是多行语句占一行,就必须要用分号了。
var foo6 = 1234  //单独一句占一行,不用加分号结尾
var foo7 = 567; println(foo7) // 两句在一行,所以中间必须加分号

6. 整型

在c语言中,整型用关键字 Int 表示。 用 long Int,short Int 等。占据4个字节。在swift中,我们也一样。我们也用Int表示整型。

1. 用Int 表示整型,swift 会自动去识别平台,是32位还是64位,会自动装换成对应的平台的长 度,
2. 用UInt 表示无符号的整型,同样,也是会自动识别是32位还是64位平台。

7. 浮点数

浮点数就是带小数的数字,比如:3.14,-3.23, 0.56 等。和其他语言一样,swift中浮点数分为 单精度Float 和双精度Double

1. Double 表示64位浮点数

2. Float 表示32位浮点数

3. 在swift中,Double最少15位数字的精度,Float最少6位数字,可以自己根据业务里判断用哪个。


8. 数值转换

不管里哪门语言,都会涉及到数值字符类型的转换,swift中是不会强制转换的,必须要手动转换,否则会报错。

比如下面的相加运算符就是错误,第三行会报错: 

var soo1 = 3
var soo2 = 4.56;
var soo3 = soo1 + soo2;
println(soo3);

所以我们必须进行转换,要么用Double(soo1) 变成浮点数,要么用Int(soo2)转换成整型。

var soo1 = 3
var soo2 = 4.56;
var soo3 = Double(soo1) + soo2; //或者 Float()
println(soo3); // 输出7.56

var soo1 = 3
var soo2 = 4.56;
var soo3 = soo1 + Int(soo2);
println(soo3); //输出 7

1. 浮点数转整型 用 Int() 函数
2. 整型转浮点数 用Double() 或者 Float() 函数
3. 转换成字符串 用 String() 函数

9. 布尔值

布尔值bool ,是一个表示真假的值,真用true, 假用falsel 表示。c语言不同 ,没有bool值,真用1,假用0。

10. 元祖

元祖这个概念还是第一次听说,说白了就有点类似于C语言中的结构体,就是把一组不同的数据类型的值聚合在一起。不同于数组,数组是把一组数据类型相同的放一起。

元祖的格式类型用()表示: var sed1 = (4054, "Net Error"),就是一个元祖,有2个元素,第一个是整型4054,第二个是字符串。类型是(Int, String)

var yuanzu = (123,"ert")
println(yuanzu)
会在控制台打印: (123, ert)

我们输出元祖的具体值的方式也有很多种,1是用直接元祖的下标。比如:yuanzu.0, yuanzu.1

var yuanzu = (123,"ert")

println(yuanzu.0)
println(yuanzu.1)
会打印出 123 和 ert。

或者有其他的变量来分解元祖中的值。用: var  (y1, y2) = yuanzu 。来输出元祖。和php中的list(y1,y2) = array 一样。遍历数组。

var yuanzu = (123,"ert")

var (y1, y2) = yuanzu;

println(y1)
println(y2)

//php中如何实现

$num = array(123, "ert");

echo $num[0];
echo $num[1];

list(y1,y2) = $num;

echo y1;
echo y2;

如果只想解析其中的元祖的值,不需要解析的用“_” 来代替。

var yangyi = (123, "ert", 456)
var (a1, _, a2) = yangyi
var (a3, a4, _) = yangyi
var (a5, _, _) = yangyi
println(a1) //输出123
println(a2) //输出456
println(a3) //输出 123
println(a4) //输出ert
println(a5) //输出123

元祖就像php中的数组一样,上面这种方式 var yuanzu = (123, "ert")  可以说成是索引数组,那么应该还有key=>value关联数组方式, 。所以还有一种元祖方式:

let http200Status = (statusCode: 200, description: "OK")
println(http200Status.statusCode) //输出 200
println(http200Status.description) //输出 ok

同样我们用 http200Status.0 和 http200Status.1 也可以同样打印出 200 和 “ok” 。是不会输出statusCode 和 description 这两个key的

let http200Status = (statusCode: 200, description: "OK")
println(http200Status.0) //同样输出200
println(http200Status.1) //同样输出 ok

那么我们有变量解析也同样可以达到一样的效果,同样,也是不会输出statusCode 和 description 这两个key的。只会输出具体的值。

let http200Status = (statusCode: 200, description: "OK")
var (c1, c2) = http200Status
println(c1) //输出 200
println(c2) //输出 ok

11. 可选类型

怎么理解可选Optional 这个新概念呢?

可选就是要么有就有值就为X,要么就是没值。这就是可选。可能有点不清楚,我们先来看例子。

var string1 = "1234"

var int2 = string1.toInt()

println(int2)

Optional(1234)

Program ended with exit code: 0

我们尝试把字符串string1转换成整型int,string1 虽然全部是数字,但是也可能会出错,所以就出现了这个可选类型。我们输出结果就是Optional Int 类型。


我们如果把一个字符串,完全是字母的转换成整型呢?会打印出什么呢?

var string1 = "stirng"

var int2 = string1.toInt()

println(int2)

nil

Program ended with exit code: 0

我们可以看到输出的是nil 空类型。

这里要注意的是,可选类型不能被 if 判断。比如:以下代码将会直接报错:

var string1 = "1234"

var int2 = string1.toInt()

if int2 { //这一行直接报错

    println(123)

} else {

    println(456)

}



为什么会这样,我们以后在if 章节中再继续讲。

12. 断言

断言这个东西,听起来感觉挺玄乎,其实很简单,在其他语言中,比如php中,我们用die() 来断言进行调试。

assert(age >= 0, "A person's age cannot be less than zero") // 比如:age = -3 整个结果为falsel了.就会触发
assert 就是用来触发断言的函数,全局可用,它有2个参数,第一个是触发条件,为false就会触发,代码运行停止,你的应用被终止。第二个参数是触发时候的dubug信息。

我们来看这个完整的例子: 

swift语言学习-3. 基本数据类型_第1张图片

我们看左边和下面就是各种信息了。

断言的使用场景:

  • 整数类型的下标索引被传入一个自定义下标脚本实现,但是下标索引值可能太小或者太大。
  • 需要给函数传入一个值,但是非法的值可能导致函数不能正常执行。
  • 一个可选值现在是nil,但是后面的代码运行需要一个非nil值。



你可能感兴趣的:(swift语言学习-3. 基本数据类型)