版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Swift是什么?Swift是苹果于WWDC2014发布的编程语言,这里引用TheSwiftProgrammingLanguage的原话:SwiftisanewprogramminglanguageforiOSandOSXappsthatbuildsonthebestofCandObjective-C,withouttheconstraintsofCcompatibility.Swiftadoptssafeprogrammingpatternsandaddsmodernfeaturestomakeprogrammingeasier,moreflexibleandmorefun.Swift’scleanslate,backedbythematureandmuch-lovedCocoaandCocoaTouchframeworks,isanopportunitytoimaginehowsoftwaredevelopmentworks.Swiftisthefirstindustrial-qualitysystemsprogramminglanguagethatisasexpressiveandenjoyableasascriptinglanguage.简单的说:Swift用来写iOS和OSX程序。(估计也不会支持其它屌丝系统)Swift吸取了C和Objective-C的优点,且更加强大易用。Swift可以使用现有的Cocoa和CocoaTouch框架。Swift兼具编译语言的高性能(Performance)和脚本语言的交互性(Interactive)。Swift语言概览基本概念注:这一节的代码源自TheSwiftProgrammingLanguage中的ASwiftTour。Hello,world类似于脚本语言,下面的代码即是一个完整的Swift程序。println("Hello,world")变量与常量Swift使用var声明变量,let声明常量varmyVariable=42myVariable=50letmyConstant=42类型推导Swift支持类型推导(TypeInference),所以上面的代码不需指定类型,如果需要指定类型:letexplicitDouble:Double=70Swift不支持隐式类型转换(Implicitlycasting),所以下面的代码需要显式类型转换(Explicitlycasting):letlabel="Thewidthis"letwidth=94letwidth=label+String(width)字符串格式化Swift使用\(item)的形式进行字符串格式化:letapples=3letoranges=5letappleSummary="Ihave\(apples)apples."letappleSummary="Ihave\(apples+oranges)piecesoffruit."数组和字典Swift使用[]操作符声明数组(array)和字典(dictionary):varshoppingList=["catfish","water","tulips","bluepaint"]shoppingList[1]="bottleofwater"varoccupations=["Malcolm":"Captain","Kaylee":"Mechanic",]occupations["Jayne"]="PublicRelations"一般使用初始化器(initializer)语法创建空数组和空字典:letemptyArray=String[]()letemptyDictionary=Dictionary<String,Float>()如果类型信息已知,则可以使用[]声明空数组,使用[:]声明空字典。控制流概览Swift的条件语句包含if和switch,循环语句包含for-in、for、while和do-while,循环/判断条件不需要括号,但循环/判断体(body)必需括号:letindividualScores=[75,43,103,87,12]varteamScore=0forscoreinindividualScores{ifscore>50{teamScore+=3}else{teamScore+=1}}可空类型结合if和let,可以方便的处理可空变量(nullablevariable)。对于空值,需要在类型声明后添加?显式标明该类型可空。varoptionalString:String?="Hello"optionalString==nilvaroptionalName:String?="JohnAppleseed"vargretting="Hello!"ifletname=optionalName{gretting="Hello,\(name)"}灵活的switchSwift中的switch支持各种各样的比较操作:letvegetable="redpepper"switchvegetable{case"celery":letvegetableComment="Addsomeraisinsandmakeantsonalog."case"cucumber","watercress":letvegetableComment="Thatwouldmakeagoodteasandwich."caseletxwherex.hasSuffix("pepper"):letvegetableComment="Isitaspicy\(x)?"default:letvegetableComment="Everythingtastesgoodinsoup."}其它循环for-in除了遍历数组也可以用来遍历字典:letinterestingNumbers=["Prime":[2,3,5,7,11,13],"Fibonacci":[1,1,2,3,5,8],"Square":[1,4,9,16,25],]varlargest=0for(kind,numbers)ininterestingNumbers{fornumberinnumbers{ifnumber>largest{largest=number}}}largestwhile循环和do-while循环:varn=2whilen<100{n=n*2}nvarm=2do{m=m*2}whilem<100mSwift支持传统的for循环,此外也可以通过结合..(生成一个区间)和for-in实现同样的逻辑。varfirstForLoop=0foriin0..3{firstForLoop+=i}firstForLoopvarsecondForLoop=0forvari=0;i<3;++i{secondForLoop+=1}secondForLoop注意:Swift除了..还有...:..生成前闭后开的区间,而...生成前闭后闭的区间。函数和闭包函数Swift使用func关键字声明函数:funcgreet(name:String,day:String)->String{return"Hello\(name),todayis\(day)."}greet("Bob","Tuesday")通过元组(Tuple)返回多个值:funcgetGasPrices()->(Double,Double,Double){return(3.59,3.69,3.79)}getGasPrices()支持带有变长参数的函数:funcsumOf(numbers:Int...)->Int{varsum=0fornumberinnumbers{sum+=number}returnsum}sumOf()sumOf(42,597,12)函数也可以嵌套函数:funcreturnFifteen()->Int{vary=10funcadd(){y+=5}add()returny}returnFifteen()作为头等对象,函数既可以作为返回值,也可以作为参数传递:funcmakeIncrementer()->(Int->Int){funcaddOne(number:Int)->Int{return1+number}returnaddOne}varincrement=makeIncrementer()increment(7)funchasAnyMatches(list:Int[],condition:Int->Bool)->Bool{foriteminlist{ifcondition(item){returntrue}}returnfalse}funclessThanTen(number:Int)->Bool{returnnumber<10}varnumbers=[20,19,7,12]hasAnyMatches(numbers,lessThanTen)闭包本质来说,函数是特殊的闭包,Swift中可以利用{}声明匿名闭包:numbers.map({(number:Int)->Intinletresult=3*numberreturnresult})当闭包的类型已知时,可以使用下面的简化写法:numbers.map({numberin3*number})此外还可以通过参数的位置来使用参数,当函数最后一个参数是闭包时,可以使用下面的语法:sort([1,5,3,12,2]){$0>$1}类和对象创建和使用类Swift使用class创建一个类,类可以包含字段和方法:classShape{varnumberOfSides=0funcsimpleDescription()->String{return"Ashapewith\(numberOfSides)sides."}}创建Shape类的实例,并调用其字段和方法。varshape=Shape()shape.numberOfSides=7varshapeDescription=shape.simpleDescription()通过init构建对象,既可以使用self显式引用成员字段(name),也可以隐式引用(numberOfSides)。classNamedShape{varnumberOfSides:Int=0varname:Stringinit(name:String){=name}funcsimpleDescription()->String{return"Ashapewith\(numberOfSides)sides."}}使用deinit进行清理工作。继承和多态Swift支持继承和多态(override父类方法):classSquare:NamedShape{varsideLength:Doubleinit(sideLength:Double,name:String){self.sideLength=sideLengthsuper.init(name:name)numberOfSides=4}funcarea()->Double{returnsideLength*sideLength}overridefuncsimpleDescription()->String{return"Asquarewithsidesoflength\(sideLength)."}}lettest=Square(sideLength:5.2,name:"mytestsquare")test.area()test.simpleDescription()注意:如果这里的simpleDescription方法没有被标识为override,则会引发编译错误。属性为了简化代码,Swift引入了属性(property),见下面的perimeter字段:classEquilateralTriangle:NamedShape{varsideLength:Double=0.0init(sideLength:Double,name:String){self.sideLength=sideLengthsuper.init(name:name)numberOfSides=3}varperimeter:Double{get{return3.0*sideLength}set{sideLength=newValue/3.0}}overridefuncsimpleDescription()->String{return"Anequilateraltriaglewithsidesoflength\(sideLength)."}}vartriangle=EquilateralTriangle(sideLength:3.1,name:"atriangle")triangle.perimetertriangle.perimeter=9.9triangle.sideLength注意:赋值器(setter)中,接收的值被自动命名为newValue。willSet和didSetEquilateralTriangle的构造器进行了如下操作:为子类型的属性赋值。调用父类型的构造器。修改父类型的属性。如果不需要计算属性的值,但需要在赋值前后进行一些操作的话,使用willSet和didSet。classTriangleAndSquare{vartriangle:EquilateralTriangle{willSet{square.sideLength=newValue.sideLength}}varsquare:Square{willSet{triangle.sideLength=newValue.sideLength}}init(size:Double,name:String){square=Square(sideLength:size,name:name)triangle=EquilateralTriangle(sideLength:size,name:name)}}vartriangleAndSquare=TriangleAndSquare(size:10,name:"anothertestshape")triangleAndSquare.square.sideLengthtriangleAndSquare.square=Square(sideLength:50,name:"largersquare")triangleAndSquare.triangle.sideLength从而保证triangle和square拥有相等的sideLength。调用方法Swift中,函数的参数名称只能在函数内部使用,但方法的参数名称除了在内部使用外还可以在外部使用(第一个参数除外),例如:classCounter{varcount:Int=0funcincrementBy(amount:Int,numberOfTimestimes:Int){count+=amount*times}}varcounter=Counter()counter.incrementBy(2,numberOfTimes:7)注意Swift支持为方法参数取别名:在上面的代码里,numberOfTimes面向外部,times面向内部。?的另一种用途使用可空值时,?可以出现在方法、属性或下标前面。如果?前的值为nil,那么?后面的表达式会被忽略,而原表达式直接返回nil,例如:letoptionalSquare:Square?=Square(sideLength:2.5,name:"optionalsquare")letsideLength=optionalSquare?.sideLength当optionalSquare为nil时,sideLength属性调用会被忽略。枚举和结构枚举使用enum创建枚举——注意Swift的枚举可以关联方法:enumRank:Int{caseAce=1caseTwo,Three,Four,Five,Six,Seven,Eight,Nine,TencaseJack,Queen,KingfuncsimpleDescription()->String{switchself{case.Ace:return"ace"case.Jack:return"jack"case.Queen:return"queen"case.King:return"king"default:returnString(self.toRaw())}}}letace=Rank.AceletaceRawValue=ace.toRaw()使用toRaw和fromRaw在原始(raw)数值和枚举值之间进行转换:ifletconvertedRank=Rank.fromRaw(3){letthreeDescription=convertedRank.simpleDescription()}注意枚举中的成员值(membervalue)是实际的值(actualvalue),和原始值(rawvalue)没有必然关联。一些情况下枚举不存在有意义的原始值,这时可以直接忽略原始值:enumSuit{caseSpades,Hearts,Diamonds,ClubsfuncsimpleDescription()->String{switchself{case.Spades:return"spades"case.Hearts:return"hearts"case.Diamonds:return"diamonds"case.Clubs:return"clubs"}}}lethearts=Suit.HeartsletheartsDescription=hearts.simpleDescription()除了可以关联方法,枚举还支持在其成员上关联值,同一枚举的不同成员可以有不同的关联的值:enumServerResponse{caseResult(String,String)caseError(String)}letsuccess=ServerResponse.Result("6:00am","8:09pm")letfailure=ServerResponse.Error("Outofcheese.")switchsuccess{caselet.Result(sunrise,sunset):letserverResponse="Sunriseisat\(sunrise)andsunsetisat\(sunset)."caselet.Error(error):letserverResponse="Failure...\(error)"}结构Swift使用struct关键字创建结构。结构支持构造器和方法这些类的特性。结构和类的最大区别在于:结构的实例按值传递(passedbyvalue),而类的实例按引用传递(passedbyreference)。structCard{varrank:Rankvarsuit:SuitfuncsimpleDescription()->String{return"The\(rank.simpleDescription())of\(suit.simpleDescription())"}}letthreeOfSpades=Card(rank:.Three,suit:.Spades)letthreeOfSpadesDescription=threeOfSpades.simpleDescription()协议(protocol)和扩展(extension)协议Swift使用protocol定义协议:protocolExampleProtocol{varsimpleDescription:String{get}mutatingfuncadjust()}类型、枚举和结构都可以实现(adopt)协议:classSimpleClass:ExampleProtocol{varsimpleDescription:String="Averysimpleclass."varanotherProperty:Int=69105funcadjust(){simpleDescription+="Now100%adjusted."}}vara=SimpleClass()a.adjust()letaDescription=a.simpleDescriptionstructSimpleStructure:ExampleProtocol{varsimpleDescription:String="Asimplestructure"mutatingfuncadjust(){simpleDescription+="(adjusted)"}}varb=SimpleStructu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二年级美术华师大版开学季第三单元同步测试卷基础版A卷
- 2026住房和城乡建设领域现场专业考试(园林绿化施工员)历年参考题库含答案详解
- 2026事业单位笔试-陕西-陕西神经外科(医疗招聘)历年参考题库含答案详解
- 2026事业单位笔试-甘肃-甘肃医学基础知识(医疗招聘)历年参考题库含答案详解
- 2026事业单位笔试-河南-河南神经外科(医疗招聘)历年参考题库含答案详解
- 2026事业单位笔试-宁夏-宁夏精神医学(医疗招聘)历年参考题库含答案详解
- 2026事业单位笔试-内蒙古-内蒙古皮肤病与性病学(医疗招聘)历年参考题库含答案详解
- 2026事业单位工勤技能-黑龙江-黑龙江林木种苗工四级(中级工)历年参考题库含答案详解
- 2026事业单位工勤技能-青海-青海有线广播电视机务员三级(高级工)历年参考题库含答案详解
- 2026事业单位工勤技能-陕西-陕西印刷工一级(高级技师)历年参考题库含答案详解
- 阿司匹林的介绍
- 大疆无人机操作培训课件
- 体育场馆消防安全知识教育培训
- 讲课合作协议合同范本
- 电信装维安全培训记录课件
- 压力管道设计培训课件
- 清洗衣物课件
- 《二十四诗品》原文及译文
- DBJ∕T15-83-2017 广东省绿色建筑评价标准
- 湖湘文化的渊源83课件
- 老年肺炎的护理课件
评论
0/150
提交评论