Swift程序设计_第1页
Swift程序设计_第2页
Swift程序设计_第3页
Swift程序设计_第4页
Swift程序设计_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Swift程序设计一、 Swift简介1.1历史Swift是Apple公司于2014年6月2日发布的全新的开发语言,Swift吸收了众多现代编译语言的优点,尽量提供简洁的编程语言和强大的功能。2014-6-12Swift中文版第一版发布。2015年12月4日,苹果公司宣布其Swift编程语言现在开放源代码。长600多页的The Swift Programming Language可以在线免费下载。Swift 是一种新的编程语言,用于编写 iOS 和 OS X 应用。Swift 结合了 C 和 Objective-C 的优点并且不受C兼容性的限制。Swift 采用安全的编程模式并添加了很多新特性

2、,这将使编程更简单,更灵活,也更有趣。Swift 是基于成熟而且倍受喜爱得 Cocoa 和 Cocoa Touch 框架,他的降临也重新定义软件开发的方式。Swift既支持面向过程的编程机制,也支持面向对象的编程方式,而且Swift的面向对象功能很强大。Swift采用了类似JavaScript的定义变量的方式,例如如下代码,var name=””;1.2第一个Swift程序当整个Swift应用只有一个源程序时,Swift源文件的第一行可执行代码就是Swift程序的入口。例如:println(“Hello World”),Swift的代码可以直接放在源程序中。Swift程序的源文

3、件命名没有太多额外的要求,只需以*.swift作为后缀即可。Swift也允许定义类,需要注意的是,Swift不允许直接将可执行代码放在类定义中。例如,如下代码是错误的,Class UserPrintln(“hello world”)当整个Swift应用由多个源程序组成时,文件名为main.swift的源程序中才可放置可执行代码,其他源程序只能定义函数、类、枚举和结构体。此时main.swift源程序中第一行可执行代码将作为Swift程序的入口。二、Swift程序设计初步2.1变量与常量Swift语言的标识符必须以字符、下划线、美元符开头,后面可以跟任意数目的字符、数字、下划线和美元符。标识符中

4、不可以包含空格,不能使用Swift的关键字。Swift语言区分大小写。Swift是强类型的语言,Swift要求所有的变量和常量必须先声明、后使用,声明变量时必须显式或隐式指定变量的类型,类型限制了一个变量能被赋的值,也限制了一个表达式可以产生的值,还限制了在这些值上可以进行的操作。声明变量需要使用var,如,var 变量名 :类型 =初始值;要么必须通过“:类型”的形式显式指定该变量的类型,要么为该变量指定初始值Swift编译器将会根据该初始值确定变量的类型,不能声明变量时既不指定变量类型,也不指定变量初始值。例如,var b : Int /声明变量时显式指定类型var name=”china

5、”/声明变量时指定初始值var age:Int =25; /声明变量时,既指定类型,也指定初始值与声明变量的方式类似,声明常量时需要使用let,如下所示:let 常量名 : 类型 = 初始值,不同的是,常量不允许被重新赋值,因此常量的值不能发生改变。例如let maxAge=120/定义常量,没有显式指定类型let eduName : String =”中山大学”;/既显式指定了常量的类型,也指定了常量 的初始值let myName=”fkit” , myAge=8/同时定义多个变量2.2基本数据类型和表达式2.2.1基本数据类型、字符串与C+语言类似,Swift语言中,基本数据类型包括整型(

6、Int、Int16、Int32、Int64、Int)、浮点型(Float、Double)、布尔型(Bool)。与C+不同的是,Swift语言提供了元组类型,元组使用圆括号把多个值组合成一个复合值,元组内的值可使用任意类型,元组并不要求元组内的值具有相同的类型。例如,定义var health=(182,78,”良好”),然后获取元组中的元素值使用println(“health元组的身高元素为:(health.0)”)。还可以为元组中的元素命名,例如,定义var health=(height:182,体重:78,status:String),那么获取数组中的元素可使用println(“health

7、的身高为:(health.height)”)。另外,Swift使用Character代表单个字符,使用String代表字符串。需要注意的是,Swift的String与Foundation框架中的NSString有非常大的差异:Foundation框架中的NSString是一个类,因此它是一种引用类型(指针类型),程序使用NSString*的形式声明字符串变量。而在程序中创建NSString对象,并将它传给一个函数或方法,或者赋值给一个变量时,程序实际上传递的只是该NSString对象的引用(指针),程序并不会复制NSString对象的副本。但String是一种值类型,程序使用String的形式

8、来声明字符串变量或常量,当程序创建一个String实例,并将它传给一个函数或方法,或者赋值给一个变量时,程序总是先复制该String实例的副本,然后传递的是原String实例的副本。2.2.2表达式与C+语言类似,Swift语言提供了赋值运算符、算术运算符、位运算符、逻辑运算符等。不同的是,Swift还添加了两个范围运算符,分别为闭范围运算符、半开范围运算符。闭范围运算符ab用于定义一个从ab的所有值的范围,对于闭运算符而言,a不能大于b。例如,var rangel=26for num in rangelPrintln(“(num)*5=(num*5)”)半开运算符a.b用于定义一个从ab(包

9、括a边界值,但不包括b边界值)的所有值的范围,半开范围运算符与闭范围运算符类似,a也不能大于b。例如,let books=“Swift”,”Objective-C”,”C”,”C+”for index in 0.books.countprintln(“第(index+1)种语言是:(booksindex)”)2.3基本控制结构与C+语言相似,Swift语言也提供了顺序、选择、循环三种控制结构。在此不再累述。2.3集合Swift集合是一种特别有用的工具,它可以用于存储数量不等的多个数据项,还可用于保存具有映射关系的关联数组。Swift提供了经典的数组和字典两种集合类型来存储集合数据,Swift的

10、数组用于按顺序存储相同类型的数据,字典则采用key-value对的形式存储数据,每项数据都由key-value对组成。2.3.1数组数组是编程语言中最常见的一种数据结构,可用于存储多个数据,每个数组元素存放一个数据,通常可通过数组元素的索引来访问数组元素,包括为数组元素赋值和取出数组元素的值。下面以一个例子讲述Swift语言中数组的用法,var myArr:Array/使用泛型语法声明数组var names:String/使用简化语法声明数组myArr=Array()/创建一个空数组,并将该空数组赋值给myArr变量name=Aray(count:10,repeatedValue:”fit”)

11、/创建一个包含10个“fit”的数组var flowers:String=“hello”,”world”;/使用简化语法创建数组,并将数组赋值给flowers变量println(name1)/输出names数组的第二个元素for book in books println(book)/使用for in遍历数组可以使用方法append()或insert()方法向数组中插入元素,使用removeAtIndex()或removeAll删除数组中的元素。2.3.2字典Swift语言中声明字典变量有两种语法:(1)使用泛型语法。字典类型的语法格式为:Dictionary,此处的尖括号就是泛型语法。(2)

12、使用简化语法。字典的语法格式为:key类型:value类型。例如,var myDict:Dictionary/使用泛型语法声明字典var health:String : String/使用简化语法声明字典myDict=Dictionary()/创建一个Dictionary结构体,使用默认的参数health=“身高”:”178”,”体重”:”74”,”血压”:”86/113”/使用简化语法创建字典var height=health“身高”println(“身高为:(height)”);/ 输出Optional(“178”)for(season,desc) in seasonsprintln(“(

13、season-(desc)”)使用for-in遍历字典同样,字典也封装了一些函数,例如修改key-value对,可使用updateValue(_:,forKey:)方法,删除key-value对,可使用removeValueForKey(key:KeyType)方法。2.4函数与闭包2.4.1函数函数是Swift程序的重要组成单位,一个Swift程序可以包含很多个函数。函数在使用之前,必须先定义函数,定义函数的语法格式如下:Func 函数名(形参列表)-返回值类型/由零条到多条可执行性语句组成的函数例如,定义函数maxfunc max(x:Int , y:Int) - Intvar z=xy?

14、x:yreturn z与C+不同的是,Swift函数还支持返回多个值的功能。Swift只要将函数的返回值类型声明为元组类型,即可声明该函数带多个返回值,然后在函数体内返回一个相应的元组即可。例如,下面定义了一个人民币转换程序,func divide(num:Double)-(String,String)var zheng=Int64(num)var xiao=round(num-Double(zheng)*100)return (“(zheng)” , “(Int(xiao)”)var result=divide(1284.546)println(“整数部分为:(result.0)”)prin

15、tln(“小数部分为:(result.1)”)对于Swift语言中,函数的形参有多种形式。(1)如果Swift在调用函数时也可以指定外部形参名,则需要在定义函数时也声明外部形参名外部形参名写在局部形参名之前,中间用英文空格隔开。如果希望让外部形参名和局部形参名保持相同,只要在局部形参名前增加英文#即可。例如,func girth2(宽 width:Double , 高 height:Double)-Doublereturn Double(2)*(width+height)println(girth2(宽:12 , 高:22.3)(2)在某些情况下,程序需要在定义函数时为一个或多个形参指定默认值

16、,这样调用函数时就可以省略该形参,而是直接使用该形参的默认值。(3)对于Swift的值类型,当程序执行变量赋值、形参传递时,程序所传递的只是副本,因此在函数体内无论对参数做了哪些修改,对参数本身不会产生任何影响。如果程序确实需要把值类型的参数传入函数内部,则可以使用In-Out参数,通过inout关键字即可声明In-Out参数。例如,func swap(inout a : Int , inout b: Int)let tmp=aa=bb=tmp该函数中两个形参都是用inout关键字声明的,这表明它们是In-Out参数,因此在该函数体内对参数a、b所做的修改将会影响参数本身。与C+语言类似,Sw

17、ift也支持函数重载。Swift允许定义多个同名函数,只要形参列表或返回值类型不同就行。如果程序包含了两个或两个以上函数名相同,但形参列表不同或返回值类型不同的函数,就被称为函数重载。2.4.2闭包闭包是现代编程语言争相引入的一种语法,如果说函数是命名、方便复用的代码块,那么闭包则是功能更灵活的代码块,它可以在程序中被传递和调用。Swift提供了简洁的闭包表达式来创建闭包,其标准语法如下,(形参列表) - 返回值类型 in/零条到多条可执行语句闭包表达式与嵌套函数的语法非常相似,因此闭包表达式的形参列表的语法与嵌套函数的形参列表的语法几乎相同。闭包的本质是功能更灵活的代码块,因此完全可以将闭包

18、赋值给变量或直接调用闭包。例如,var square=(value val:Int) - Int inreturn val*valprintln(square(5)var result=(#base: Int , #exponent : Int) - Int invar result=1for i in 1exponentresult*=basereturn result(4,3)println(result)完整的闭包表达式需要定义形参类型、返回值类型,但Swift可以根据闭包表达式上下文推断形参类型、返回值类型,那么闭包表达式就可以省略形参类型、返回值类型。例如,var square:(I

19、nt) - Int=(val) in return val*val/闭包表达式可以省略形参类型、返回值类型var square:(Int) - Int=val in return val*val/进一步省略形参列表的圆括号三、面向对象Swift不仅提供了面向过程的编程支持,也提供了全面的面向对象支持,与普通面向对象的编程语言不同,Swift可以定义枚举、结构体、类3种面向对象的类型。从功能上看,Swift的类、结构体、枚举具有完全平等的地位。但是在Swift中,实例和对象是不同的只有类的实例才能被称之为对象,而结构体和枚举的实例只能称之为实例。3.1枚举、类和结构体Swift的枚举是一种完全重

20、新定义的类型。Swift的枚举具有很多面向对象的特征,Swift的枚举支持计算属性,支持实例方法和类型方法,支持定义构造器完成初始化,Swift允许通过扩展来增强枚举的功能。下面程序定义了一个Season枚举,enum Seasoncase Springcase Summercase Fallcase Winter/使用枚举声明变量var day: Weekday/使用已有的枚举实例赋值day=Weekday.SundaySwift的类和结构体高度相似,无论是从定义语法还是用法上,Swift的类和结构体都具有高度的相似性。主要区别在于:(1)结构体不支持继承(2)结构体不支持定义析构器(3)结

21、构体是值类型,而类是引用类型结构体和类的语法格式非常相似,定义类的格式如下,修饰符 class 类名零个到多个构造器零个到多个属性零个到多个方法零个到多个下标例如,定义一个Person类,class Personvar name:String =”var age:Int =0func say(content :String)println(content)下面定义一个dog结构体,struct dogvar name:Stringvar age:Intfunc run()println(“(name)迅速地奔跑”)构造器用于完成实例的构造过程,这个过程包括为实例中的每个存储属性设置初始值和执行

22、必要的准备和初始化任务。Swift的构造器无须显式声明返回值类型,也无须显式使用return返回实例,swift构造器的本质就是一个或多个名为init的函数。Swift为程序员提供了两个构造器:无参数的构造器和初始化所有实例存储属性的构造器。如果类中存在需要在构造器中指定初始值的实例存储属性,则该类必须由程序员定义构造器。创建实例的根本途径是构造器,通过“类型名(参数)”的形式即可调用该类或结构体构造器。例如,var p=Person()/使用Swift提供的无参构造器=”孙悟空”p.say(“Swift 语言很简单,学习很容易!”)println()3.2存储属性和计

23、算属性存储属性指的是存储在类、结构体里的变量或常量,存储属性既可是变量,使用var声明,也可是常量,使用let声明。与C+类似,Swift的存储属性又可分为存储实例属性和类型存储属性,其中实例存储属性属于单个的实例;而类型属性则属于类型本身。计算属性相当于Objective-C、java等语言通过getter、setter合成的属性,枚举、结构体、类都可以定义计算属性。例如,下面程序定义了一个计算属性,class Uservar first:String =”var last:String=”var fullName:Stringgetreturn first+”-”+lastset(newV

24、alue)var names=newVponentsSeparatedByString(“-”)selt.first=names0self.second=names13.3属性观察者、下标为了让程序能在属性被赋值时获得执行代码的机会,Swift提供了属性观察者机制,属性观察者其实就两个特殊的回调方法。willSet(new Value):被观察的属性即将被赋值之前自动调用该方法didSet(oldValue):被观察的属性被赋值完成之后自动调用该方法属性观察者可以监听如下属性的改变,(1)除了延迟存储属性之外的所有存储属性(包括实例属性和类型存储属性)。(2)可通过重载方式为继承得到的属性(包

25、括存储属性和计算属性)添加属性观察者。另外,所有的Swift类型(枚举、结构体、类)都支持定义下标,下标可作为访问对象、集合或序列的简化方式。同一类型中定义不同的下标被称为下标重载。Swift使用subscript关键字定义下标。例如,Struct FKRectvar x:Intvar y:Intsubscript(idx:Int)-Intgetswitch(idx)case 0: return self.xcase 1: return self.ysetswitch(idx)case 0: self.x=newValuecase 1:self.y=newValuevar rect=FkRec

26、t(x:20,y:12,width:200,height:300)/通过下标对rect的属性赋值rect0=40rect1=67/通过下标访问rect的属性println(“rect 矩形的左上角x坐标为:(rect0),y坐标为:(rect1)”)3.4继承Swift的继承通过“:父类”的形式来实现,实现继承的类称为子类,被继承的类称为父类。子类继承父类,可以从父类那里得到属性、方法、下标、构造器。也可以重写父类的属性、方法、下标。Swift摒弃了C+中难以理解的多重继承特征,即每个类最多只有一个直接父类。例如,class Birdfunc fly()println(“我在天空里自由自在地飞

27、翔”)class Ostrich : Birdoverride func fly()/重写父类方法,使用override关键字println(“我只能在地上奔跑”)Swift类的构造需要两个阶段完成。第一阶段:先为存储属性分配内容,使用本类的构造器初始化由本类定义的存储属性;然后沿着构造器向上,逐个调用各父类构造器初始化对应父类定义的存储属性。第二阶段:从最顶层父类开始,沿着顶部构造器链向下,每个构造器都可再次修改存储属性。3.5多态Swift引用变量有两个类型:一个是编译时类型,一个是运行时类型。编译时类型由声明该变量时使用的类型决定,编译器只认每个变量的编译时类型;运行时类型由实际赋给该变

28、量的实例决定。如果编译时类型和运行时类型不一致,就可能出现所谓的多态。例如,当把一个子类实例直接赋给父类引用变量时,在运行时调用该引用变量的方法时,其方法行为总是表现出子类方法的行为特征,而不是父类的行为特征,这就可能出现:相同类型的变量、调用同一个方法时呈现出多种不同的行为特征,这就是多态。可以使用is运算符判断前面的引用变量是否引用后面的类,或者其子类、实现类的实例。如果是,则返回true,否则返回false。编写Swift程序时,引用变量只能调用其编译时类型的方法,而不能调用其运行时类型的方法,即使它实际所引用的实例确实包含该方法。如果需要让这个引用变量调用其运行时类型的方法,则必须把它强制转换其实际的类型,这种强制类型转换也称为向下转型。向下转型需要借助向下转型运算符,Swift提供了向下转型运算符as强制将运算符前面的引用变量转换为后面的类型。例如,let objStr:NString=obj as NSString。3.6扩展扩展是Swift的一种动态特性,Swift允许使用扩展为现有的类添加新方法,并且不需要创建子类,不需要访问原有类的源代码。Swift中的扩展可以为现有类添加类型存储属性、实例计

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论