swift中文文档gitbooks地址:https://numbbbbb.gitbooks.io/-the-swift-programming-language-/content/  


1、常量与变量的定义

在swift中,我们用let来定义一个常量,用var来定义一个变量,例如:


[objc]  view plain  copy

1. let a=10;  
2. var b=12;

发现没有,我们不需要为其指定类型,编译器会根据变量的值来确定变量的类型;当然,如果没有给变量设定初始值,就应该声明变量的类型,如:


[objc]  view plain  copy

1. var b:String;  
2.   
3. b="adc";

当然,后面的分号可以不要,不过我还是给加上了,这样代码多了,结构会清晰些。。。Swift中可以使用几乎任何字符来作为常量和变量名,包括Unicode,但是名称中不能含有数学符号,箭头,无效的Unicode,横线-和制表符,且不能以数字开头,尽管数字可以包含在名称里。一旦完成了声明,就不能再次声明相同名称的变量或常量,或者改变它的类型。例如:


[objc]  view plain  copy

1. let 王子="wangzi";  
2.   
3. var 大人="daren";  
4.   
5. var 22="2222";  //包含数字,错误  
6.   
7. var _a="a";  
8.   
9. var 王2="2";


2、输出常量与变量

Swift使用 println()函数来输出常量或变量,当然print函数也一样,println带换行,例如:


[objc]  view plain  copy

1. println(a);  
2.     
3. print(b);

println函数还可以格式化输出一些日志信息,就像是Cocoa中NSLog函数的行为一样,可以包括一些常量和变量本身。Swift在字符串中插入变量名作为占位符,通过\()来表示,例如:



[objc]  view plain  copy

1. var b:String;  
2. b="adc";  
3. println("我是\(b)");

输出:我是adc

3、Int类型和UInt类型

我们知道在不同的平台下,int类型的长度不同,在OC中,我们可以用NSInteger来表示一个int类型,它可以根据所处平台来定义int的长度



[objc]  view plain  copy     

1. #if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64  
2. typedef long NSInteger;  
3. typedef unsigned long NSUInteger;  
4. #else  
5. typedef int NSInteger;  
6. typedef unsigned int NSUInteger;  
7. #endif


在Switf中,我们可以用Int来定义一个int类型,一般来说,编程人员在写代码时不需要选择整数的位数,Swift提供了一种额外的整数类型Int,是和当前机器环境的字长相同的整数位数在32位机器上就表示32位长度,在64位机器上就表示64位长度。Swift还提供了一种无符号类型UInt,同理也是和当前机器环境的字长相等。


[objc]  view plain  copy

1. var cc :Int=20;


Swift是一种类型安全的语言。类型安全就是说在编程的时候需要弄清楚变量的类型。如果您的代码部分需要一个字符串,你不能错误地传递一个整数类型。

因为Swift是类型安全的,它会在编译的时候就检查你的代码,任何类型不匹配时都会报错。这使得编程人员能够尽快捕获并尽可能早地在开发过程中修正错误。

类型检查可以在使用不同类型的值时帮助避免错误。但是,这并不意味着你必须指定每一个常量和变量所声明的类型。如果不指定你需要的类型,Swift使用类型推导来指定出相应的类型。类型推导使编译器在编译的时候通过你提供的初始化值自动推导出特定的表达式的类型。

类型推导使Swift比起C或Objective-C只需要更少的类型声明语句。常量和变量仍然显式类型,但大部分指定其类型的工作Swift已经为你完成了。


4、类型别名

我们在其他语言比如C/C++、OC中经常会用到typedef,用来为一种数据类型定义一个新名字,在Swift中用typealias来现有的类型定义可替代名称,例如:



[objc]  view plain  copy

1. typealias MyInt = Int;  
2.   
3. var dd:MyInt;


5、元组类型

元组,这个在OC中是没有的,它可以将几种数据类型组成一个元素,数据类型可以一样,也可以不一样,用()表示,例如(Int,String,Int)等表示;编程人员可以随意地创建自己需要的元组类型,比如 (Int, Int, Int), 或者(String, Bool)等。同时组成元组的类型数量也是不限的。例如:


[objc]  view plain  copy

1.   let httpStatus=(404,"Not Found");  
2.     
3. 23,"rose");  
4.     
5. //  var person2 : (Int,String) = (age :23, name :"rose");   //在明确指定元素类型的情况下不能加上元素名称  
6.     
7. 3=(age :23, name :"rose");  
8.     
9. //可以使用下划线_忽略某个元素的值,取出其他元素的值  
10. 4 = (20,"jack");  
11. 4;  
12.   
13.   println(httpStatus);  
14. .0);  
15. 3.age);  
16.   println(name);

6、可选类型和强制解包

什么是可选类型,可选类型就是这种类型的值要么存在,并且等于某某值,要么就是不存在。比如在某个字符串中查找某个字符,要么存在这个字符,要么不存在这个字符


[objc]  view plain  copy

1.         //可选类型的格式:类型名?  
2.         var kIndex :Int?;  
3. //        问号?表明kIndex的值是可选的,可能是一个Int,也可能值不存在  
4. //        kIndex的值要么是Int类型,要么是nil(nil代表值不存在)  
5. //        kIndex默认就是nil,因此上面的语句相当于  
6. nil



[objc]  view plain  copy

1. //        不能直接将可选类型赋值给具体类型  
2. //        比如不能将Int?类型直接赋值给Int类型,因为Int?都不确定有没有整数值  
3.  people:Int?=10;  
4.           
5.  people2:Int=people;

上面那样表示错误,但反过来可以,你可以把int类型值赋给Int?类型,如果要让上面表达正确,我们可以强制解包,用!表示,


[objc]  view plain  copy

1. var people:Int?=10;  
2.   
3. var people2:Int=people!;

这表示我确定变量people确实是存在10这样一个值的,注意 如果可选类型的值不存在,仍然进行强制解包,会报一个错误




[objc]  view plain  copy

1. var num :Int?  
2. var numValue =num!// 这行会报错

我们可以用if条件语句来判断一个可选类型的值是否存在,



[objc]  view plain  copy

1. let nums = "100".toInt();  
2.   
3. if(nums)  
4. {  
5. "num的值是\(nums!)")  
6. }else  
7. {  
8. "num的值不存在")  
9. }

默认情况下:如果想将可选类型的值赋给具体类型,比如将 Int? 的值赋给 Int 类型,需要使用感叹号 ! 进行强制解包  ,我们可以声明成隐式解包,

[objc]  view plain  copy

1. var num :Int! =20  
2. var numValue :Int =num // 自动解包,不用再使用! 进行强制解包  
3. // num是被声明为隐式解包的可选类型Int!