Apple取消了oc的指针以及其他不安全的访问的使用,舍弃的smalltalk语法,全面改为点语法,提供了类似java的命名空间 范型 重载;
首先我们了解一下Swift这门语言。Swift就像C语言一样,使用变量来进行存储并通过变量名来关联值。在swift中广泛的使用着不可变的变量,也就是我们常说的常量。但是Swift远远比C语言的常量强大。记住这里说的是比C的常量强大,并不是比C语言强大。这点要理解清楚。在Swift中如果你需要处理的值不需要改变,那使用常量的可以让我们的代码更清晰地表达我们的意图和逻辑。
除了我们熟悉的类型,Swift还增加了Objective-C中没有的高阶数据类型比如元组(Tuple)。元组可以让你创建或者传递一组数据,比如作为函数的返回值时,我们可以用一个元组可以返回多个值
Swift增加了可选(optional)类型,用于处理值缺失的情况。所谓的可选类型,接触过OC的肯定比较清楚一下。可选类型像是Objective-C中使用的nil,但是它可以在任何类型上,不仅仅是类!Swift有了可选类型的存在比OC中的nil指针更加安全也更具表现力。它是Swift许多强大类型的重要组成部分。
常量和变量
常量和变量必须在使用前声明,用let来声明常量,用var来声明变量
例如:
1 let max = 10; 2 3 var min =1;
对象(Objects)
变量也可以表示对象,对象的类型就是类的名字。记住,类就是这个对象的蓝图,类里面包含了对象所有的属性和行为。
下面这行代码,用var
表示这是一个变量,用fastCar
作为变量名,冒号后声明这个变量是对象类型,在这里,就是Car
,最后,用等号表示这个变量的初始值是一个新的车对象:
var fastCar: Car = Car()
字符串中的变量(Variables in Strings)
使用字符串插入(string interpolation),可以直接在变量中增加字符串。字符串插入这个术语是指在一个字符串里使用占位符来产生一个字符串。程序运行后,这些占位符就会直接调用。在这里,字符串是用双引号表示的,那么占位符是用\()
表示的,两个括号中是需要插入的字符串。字符串插入这个方法可以将一个非字符串的变量方便地转换为字符串类型:
1 let seatsPerRow = 25 2 let numberOfRows = 25 3 var seatsString = "In the theater, there are \(numberOfRows) rows and \(seatsPerRow) seats in each row." //In the theater, there are 15 rows and 25 seats in each other row.
类型推断(Type Inference)
为每一个变量和常量声明类型可是一件体力活,苹果公司的工程师一直致力于让开发者的工作更轻松。基于你提供的等号右边的值,Swift可以自己判断类型,也就是具有类型推断的能力,这使得声明变量更加容易。请见下面的例子:
1 var numberOfYears = 30 2 let name = "Steve" 3 let isMale = true 4 var bankAccountBalance = 1034.20
冒号和冒号后面的类型就不需要了,因为Swift可以根据等号右边的值来推断类型,然后自动设定变量的类型。这样能节省不少时间,也能让代码更简洁。
类型标注:
当我们声明常量或者变量的时候可以加上类型标注,说明常量或者变量中要存储的值的类型。如果要添加类型标注,需要在常量或者变量名后面加上一个冒号和空格,然后加上类型名称。
例如:
1 var welcomeMessage:String
在welcomeMessage中我们可以理解为:”声明一个类型为String,名字为welcomeMessage的变量”
类型为String的意思是可以存储任意String类型的值
welcomeMessage = “Hello”
我们在Swift中可以根据自己喜欢的字符作为常量和变量名,包括Unicode字符!
例如:let $ = 3.3333,let你好=”Hello word!”,let?? =“dogcow”
注意:常量与变量名不能包含数学符号,箭头,保留的(或者非法的)Unicode码位,连线与制表符。也不能以数字开头,但是可以在常量与变量名的其他地方包含数字。
注意:如果我们需要使用Swift中保留关键字相同的名称作为常量或者变量名,我们可以使用反引号(^)将关键字包围的方式将其作为名字使用,但是无论如何我们都应当避免使用关键字作为常量或变量名。
集合(Collection)
在某些情况下,有必要将许多变量或常量更好地组织在一起,Swift提供2种集合类型来保存和组织这些变量。
数组(Arrays)
数组(Array)是按照聚体顺序存储多个变量的容器。数组可以存储几乎无限的元素(item),同时每个元素都有一个数组下标,准确标明此元素在数组中的位置。可以这样声明一个数组:
1 var names: [ String ] = [ "Steve", "Jeff", "Andy", "Andrew", "Cole", "Mike", "Mikey" ]
开头还是var
,接着是冒号,然后是方括号,方括号里是数组的类型,等号的右边,用方括号括起来所有的数组元素,里面每个数组元素用逗号分开。
在Swift中,数组中所有的元素必须是同样的类型,这以为着一个数组能存储所有的字符串,如上面的例子,但是不能存储整型和字符串2种不同的类型的元素。数组只能存储同样类型的变量。
对于一个既定的数组,Swift可以自行判断出类型,没有必要专门写出数组的类型,所以上面的数组也可以写成这样:
1 var names = [ "Steve", "Jeff", "Andy" ]
也可以给你的数组增加一个数组:
var names = [ "Steve", "Jeff", "Andy", "Wally" ] var parents = [ "Mike", "Adam", "Nick" ] names = names + parents // [ "Steve", "Jeff", "Andy", "Wally", "Mike", "Adam", "Nick" ]
词典(Dictionaries)
数组不是唯一的集合类型,词典也可以存储多个变量,用键(Key)和值(value)将多个变量组织在一起。键值的工作原理和你书架上的牛津大词典类似,键(Key)是你要查找的单词,而值(value)是这个单词的释义。词典是无序存储的,所以只能使用键(key)来获取某个值(value),例如:
1 var homeruns : [ String : Int ] = [ "Posey" : 24, "Pagan" : 19, "Pence" : 15 ]
在这个例子中,有三个键(keys):"Posey"
, "Pagan"
, "Pence"
,每个键都有对应的值。提高相关的键,写在中括号中,就能获取相对应的值:
homeruns[ "Posey" ] // 24
增加一对键值:
var homeruns : [ String : Int ] = [ "Posey" : 24, "Pagan" : 19, "Pence" : 15 ] homeruns[ "Sandoval" ] = 10 // [ "Posey" : 24, "Pagan" : 19, "Pence" : 15, "Sandoval" : 10 ]
将键对应的值设置为空(nil),就可以删除这对键值。nil是空值,我们将在章节结束的时候更深入的介绍nil。删除键值方法:
1 homeruns [ "Sandoval" ] = nil // [ "Posey" : 36, "Pagan" : 19, "Pence" : 15 ]
输出常量和变量
在Swift中print(_:separator: terminator:)函数来输出当前常量或变量的值:
注:这也是区别OC语言之处
Swift用字符串插值(string interpolation)的方式把常量名或者变量名当做占位符加入到长字符串中,Swift会用当前常量或变量的值替换这些占位符。将常量或变量名放入圆括号中,并在开括号前使用反斜杠将其转义:
1 print("The current value of friendlyWelcome is \(friendlyWelcome)") //输出"The current value of friendlyWelcome is Bonjour! 2 3
分号的使用
与其他大部分编程语言不同,Swift并不强制要求我们在每条语句的结尾处使用分号(;),当然,你也可以按照 你自己的习惯添加分号。有一种情况下必须要用分号,即我们打算在同一行内写多条独立的语句:
1 2 3 |
let cat = "?" ; print ( cat ) //输出"?" |
类型别名
布尔值
Swift有一个基本的布尔类型,叫做Bool。布尔值指逻辑上的值,因为它们只能是真或者假。Swift有两个布尔常量,true和false:
1 2 3 |
let orangesAreOrange = true
|
在我们编写条件语句,比如说if语句的时候,布尔值非常的好用
1 if turnipsAreDelicious { 2 3 print("Mmm,tasty turnips!") 4 5 } else { 6 7 print("Eww,turnips are horrible.") 8 9 }//输出"Eww, turnips are horrible." 10 11
元组
元组把多个值组合成一个复合值。元组内的值可以是任意类型,并不要求是相同类型
let http404Error = (404, "Not Found")
我们可以把任意顺序的类型组合成一个元组,这个元组可以包含所有类型
1 let (statusCode,statusMessage) = http404Error 2 3 print("The status code is \(statusCode)")//输出"The status code is 404" 4 5 print("The status message is \(statusMessage)") //输出"The status message is Not Found"