iOS开发系列--Swift语言
Swift是苹果2014年推出的全新的编程语言它继承了C语言、ObjC的特性且克服了C语言的兼容性问题。Swift发展过程中不仅保留了ObjC很多语法特性它也借鉴了多种现代化语言的特点在其中你可以看到C#、Java、Javascript、Python等多种语言的影子。同时在2015年的WWDC上苹果还宣布Swift的新版本Swift2.0并宣布稍后Swift即将开源除了支持iOS、OS X之外还将支持linux。本文将继续iOS开发系列教程假设读者已经有了其他语言基础强烈建议初学者从本系列第一章开始阅读如果您希望从Swift学起那么推荐你首先阅读苹果官方电子书《the swift programming language》不会从零基础一点点剖析这门语言的语法旨在帮助大家快速从ObjC快速过度到Swift开发中。即便如此要尽可能全面的介绍Swift的语法特点也不是一件容易的事情因此本文将采用较长的篇幅进行介绍。基础部分第一个Swift程序数据类型基础类型集合类型元组可选类型运算符控制流函数和闭包函数闭包类属性方法下标脚本继承协议扩展枚举和结构体结构体枚举泛型基础部分第一个Swift程序创建一个命令行程序如下123456importFoundation/*** Swift没有main函数默认从top level code的上方开始自上而下执行因此不能有多个top level代码*/println(Hello, World!)从上面的代码可以看出Swift没有main函数从top level code的上方开始往下执行就是第一个非声明语句开始执行[表达式或者控制结构类、结构体、枚举和方法等属于声明语句]不能存在多个top level code文件(否则编译器无法确定执行入口事实上swift隐含一个main函数这个main函数会设置并调用全局 “C_ARGC C_ARGV”并调用由top level code构成的top_level_code()函数)Swift通过import引入其他类库和Java比较像Swift语句不需要双引号结尾尽管加上也不报错除非一行包含多条语句和Python有点类似数据类型Swift包含了C和ObjC语言中的所有基础类型Int整形Float和Double浮点型Bool布尔型Character字符型String字符串类型当然还包括enum枚举、struct结构体构造类型Array数组、Set集合、Dictionary字典集合类型不仅如此还增加了高阶数据类型元组Tuple可选类型Optinal。基础类型Xcode 从6.0开始加入了Playground代码测试可以实时查看代码执行结果下面使用Playground简单演示一下Swift的基础内容对Swift有个简单的认识1234567891011121314151617181920212223242526272829303132333435363738importFoundationvara:Int1//通过var定义一个变量//下面变量b虽然没有声明类型但是会自动进行类型推断这里b推断为Int类型varb2varc:UInt3letdab//通过let定义一个变量//下面通过\()实现了字符串和变量相加(字符串插值)等价于println(dString(d))println(d\(d))//结果d3//注意由于Swift是强类型语言a是Int类型而c是UInt类型二者不能运算下面的语句报错;但是注意如果是类似于let a12.0是不会报错的因为两个都是字面量Swift会首先计算出结果再推断a的类型//let eac//Int.max是Int类型的最大值类似还有Int.min、Int32.max、Int32.min等leteInt.max//结果9223372036854775807varf:Float1.0varg2.0//浮点型自动推断为Double类型varh:Stringhello //emoj表情也可以作为变量或者常量事实上所有Unicode字符都是可以的varlove and apple//两个字符串相加但是注意不同类型不能相加varih//结果:hello love and apple//布尔类型只有两个值true、false类似于if语句中的条件只能是布尔类型不能像ObjC一样非0即真varj:Booltrue//字符类型同样使用双引号但是只能是一个字符如果不指定类型则c默认会推断为字符串var k:Characterc是字符类型但是var kc是字符串类型vark:Charactercvarl00100//等于100可以在前面添加额外的0varm10_000_000//等于10000000可以使用增加额外的下划线方便阅读而不改变值的大小Swift通过var进行变量定义通过let进行常量定义这和其他高级语言比较类似例如F#Swift添加了类型推断对于赋值的常量或者变量会自动推断其具体类型Swift是强类型语言应该说它比C#、Java等强类型语言控制还要严格不同的数据类型之间不能隐式转化如果需要转化只能强制转化在Swift中类型转换直接通过其类型构造函数即可降低了API的学习成本集合类型Swift提供了三种集合类型数组Array、集合Set、字典Dictionary。和ObjC不同的是由于Swift的强类型集合中的元素必须是同一类型而不能像ObjC一样可以存储任何对象类型,并且注意Swift中的集合是值类型而非引用类型事实上包括String、结构体struct、枚举enum都是值类型。首先看一下Swift中的数组123456789101112131415161718192021222324252627282930313233//声明数组的时候必须确定其类型下面使用[String]声明一个字符串数组[String]是ArrayString简单表达形式//var a:ArrayString[hello,world]vara:[String][hello,world]a[0]//访问数组元素//下面创建一个Double类型的数组这里没有使用字面量当前是一个空数组当然也可以写成var b:[Double][]varb[Double]()foriina{println(i\(i))}//添加元素Swift中可变类型不再由单独的一个类型来表示统统使用Array如果想声明为不可变数组只要使用let定义即可a.append(!)a[I,am,Kenshin]//追加元素println(a.count\(a.count))//结果a.count6a[3...5][I,Love,Swift]//修改元素,但是注意无法用这种方式添加元素//a[6][.]//这种方式是错误的a.insert(New,atIndex:5)//插入元素hello world! I Love New Swifta.removeAtIndex(5)//删除指定元素//使用全局enumerate函数遍历数据索引和元素for(index,element)inenumerate(a){println(index\(index),element\(element))}//使用构造函数限制数组元素个数并且指定默认值,等价于var cArray(count: 3, repeatedValue: 1)自动推断类型varc[Int](count:3,repeatedValue:1)Set表示没有顺序的集合12345678910111213//注意集合没有类似于数组的简化形式例如不能写成var a:[String][hello,world]vara:SetString[hello,world]varb:Set[1,2]//类型推断SetInta.insert(!)//注意这个插入不保证顺序if!a.isEmpty{//判断是否为空a.remove(!)}if!a.contains(!){a.insert(!)}Dictionary字典同样是没有顺序的并且在Swift中字典同样要在使用时明确具体的类型。和ObjC中一样字典必须保证key是唯一的而这一点就要求在Swift中key必须是可哈希的不过幸运的是Swift中的基本类型如Int、Float、Double、Bool、String都是可哈希的都可以作为key。123456789101112131415161718192021//通过字面量进行字典初始化注意等价于var a:DictionaryInt,String[200:success,404:not found]vara:[Int:String][200:success,404:not found]varb[200:success,404:not found]//不声明类型根据值自动推断类型a[200]//读取字典a[404]can not found//修改a[500]internal server error//添加//a[:] //设置为空字典,等价于a[Int:String]()forcodeina.keys{println(code\(code))}fordescriptionina.values{println(description\(description))}for(code,description)ina{println(code\(code),description\(description))}注意在Swift中集合的可变性不是像ObjC一样由单独的数据类型来控制的而是通过变量和常量来控制这一点和其他高级语言比较类似。元组Tuple在开发过程中有时候会希望临时组织一个数据类型此时可以使用一个结构体或者类但是由于这个类型并没有那么复杂如果定义起来又比较麻烦此时可以考虑使用元组。1234567891011121314151617181920212223242526272829303132333435363738394041/*** 元组的基本用法*/varpoint(x:50,y:100)//自动推断其类型(Int,Int)point.x//可以用类似于结构体的方式直接访问元素,结果50point.y//结果100point.0//也可以采用类似数组的方式使用下标访问结果50point.1//结果100//元组也可以不指定元素名称访问的时候只能使用下标letframe:(Int,Int,Int,Float)(0,0,100,100.0)println(frame)//结果(0, 0, 100, 100.0)//注意下面的语句是错误的如果指定了元组的类型则无法指定元素名称//let frame:(Int,Int,Int,Int)(x:0,y:0,width:100,height:100)varsize(width:100,25)//仅仅给其中一个元素命名size.width//结果100size.1//结果25varhttpStatus:(Int,String)(200,success)//元组的元素类型并不一定相同var(status,description)httpStatus//一次性赋值给多个变量此时status200descriptionsuccess//接收元组的其中一个值忽略另一个值使用_(注意在Swift中很多情况下使用_忽略某个值或变量)var(sta,_)httpStatusprintln(sta\(sta))//结果sta200/*** 元组作为函数的参数或返回值借助元组实现了函数的多个返回值*/funcrequest()-(code:Int,description:String){return(404,not found)}varresultrequest()result.0//结果404result.1//结果not foundresult.code//结果404result.description//结果not found可选类型所谓可选类型就是一个变量或常量可能有值也可能没有值则设置为可选类型。在ObjC中如果一个对象类型没有赋值则默认为nil同时nil类型也只能作为对象类型的默认值对于类似于Int等基本类型则对应0这样的默认值。由于Swift是强类型语言如果在声明变量或常量时没有进行赋值Swift并不会默认设置初值这一点和其他高级语言不太一样例如C#虽然也有可选类型但是要求并没有那么严格。

相关新闻