版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Swift是什么Swift是苹果于WWD2014发布的编程语言,这里引用TheSwiftProgrammingLanguage的原话:SwiftisanewprogrammingIanguageforiOSandOSXappsthatbuildsonthebestofCandObjective-C, withouttheconstraints ofCcompatibility. Swiftadoptssafeprogrammingpatternsandaddsmodernfeaturestomakeprogrammingeasier,moreflexibleandmorefun.Swift'scleanslate,backedbythematureandmuch -lovedCocoaandCocoaTouchframeworks,isanopportunity toimaginehowsoftwaredevelopmentworks.Swiftisthefirst industrial-quality systemsprogrammingIanguagethatisasexpressiveandenjoyableasascriptingIanguage.简单的说:Swift用来写iOS和OSX程序。(估计也不会支持其它屌丝系统)Swift吸取了C和Objective-C的优点,且更加强大易用。Swift可以使用现有的Cocoa和CocoaTouch框架。Swift兼具编译语言的高性能 (Performanee)和脚本语言的交互性 (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"19varoccupations=["Malcolm":"Captain","Kaylee":"Mechanic",]occupations["Jayne"]="PublicRelations"一般使用初始化器(initializer)语法创建空数组和空字典:letemptyArray=String[]()letemptyDictionary=DictionaryvString,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==nil12varoptionalName:String="JohnAppleseed"vargretting="Hello!"ifletname=optionalName{gretting="Hello,'(name)"}灵活的switchSwift中的switch支持各种各样的比较操作:letvegetable="redpepper"switchvegetable{case"celery":letvegetablecomment="Addsomeraisinsandmakeantsonalog."case"cucumber","watercress":letvegetablecomment="Thatwouldmakeagoodteasandwich."caseletxwhere("pepper"):letvegetablecomment="Isitaspicy\(x)"default:letvegetablecomment="Everythingtastesgoodinsoup."}其它循环
for-in除了遍历数组也可以用来遍历字典:29letinterestingNumbers=[30"Prime":[2,3,5,7,11,13],31"Fibonacci":[1,1,2,3,5,8],32"Square":[1,4,9,16,25],33]34varlargest=035for(kind,numbers)ininterestingNumbers{36fornumberinnumbers{37ifnumber>largest{38largest=number39}40}41}42largestwhile循环和do-while循环:43varn=244whilen<100{45n=n*246}4748n49varm=250do{51m=m*252}whilem<10053mSwift支持传统的for循环,此外也可以通过结合..(生成一个区间)和for-in实现同样的逻辑。54varfirstForLoop=055foriin0..3{56firstForLoop+=i57}58firstForLoop59varsecondForLoop=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,,}getGasPrices()支持带有变长参数的函数:funcsumOf(numbers:Int...)->Int{varsum=0fornumberinnumbers{sum+=number}returnsum}sumOf()sumOf(42,597,12)函数也可以嵌套函数:funcreturnFifteen()->Int{vary=10funcadd(){y+=5TOC\o"1-5"\h\z}add()returny}returnFifteen()作为头等对象,函数既可以作为返回值,也可以作为参数传递:funcmakeIncrementer()->(Int->Int){funcaddOne(number:Int)->Int{return1+number}returnaddOne}varincrement=makelncrementer()increment(7)funchasAnyMatches(list:Int[],condition:Int->Bool)->Bool{foriteminlist{ifcondition(item){returntrueTOC\o"1-5"\h\z}}returnfalse}funclessThanTen(number:Int)->Bool{returnnumber<10}varnumbers=[20,19,7,12]hasAnyMatches(numbers,lessThanTen)闭包
本质来说,函数是特殊的闭包,Swift中可以利用{}声明匿名闭包:({(number:Int)->Intinletresult=3*numberreturnresult})当闭包的类型已知时,可以使用下面的简化写法:({numberin3*number})此外还可以通过参数的位置来使用参数,当函数最后一个参数是闭包时,的语法:sort([1,5,3,12,2]){$0>$1}类和对象创建和使用类Swift使用class创建一个类,类可以包含字段和方法:classShape{varnumberOfSides=0funcsimpleDescription()->String{return"Ashapewith\(numberOfSides)sides."}}创建Shape类的实例,并调用其字段和方法。varshape=Shape()=7varshapeDescription=()可以使用下面也可以隐式引用通过init构建对象,既可以使用self显式引用成员字段(name),(numberOfSides)。可以使用下面也可以隐式引用classNamedShape{varnumberOfSides:Int=0varname:String7init(name:String){=name}11funcsimpleDescription()->String{return"Ashapewith\(numberOfSides)sides."}}使用deinit进行清理工作。继承和多态Swift支持继承和多态(override父类方法)16classSquare:NamedShape{17varsideLength:Double1819init(sideLength:Double,name:String){20=sideLength21(name:name)22numberOfSides=423}2425funcarea()->Double{26returnsideLength*sideLength27}
2829overridefuncsimpleDescription()->String{30return"Asquarewithsidesoflength\(sideLength)."31}32}33lettest=Square(sideLength:,name:"mytestsquare")34()35()注意:如果这里的simpleDescription方法没有被标识为override,则会引发编译错误。属性为了简化代码,Swift引入了属性(property),见下面的perimeter字段:36classEquilateralTriangle:NamedShape{37varsideLength:Double=3839init(sideLength:Double,name:String){40=sideLength41(name:name)42numberOfSides=343}4445varperimeter:Double{46get{47return*sideLength48}49set{50sideLength=newValue/51}52}53overridefuncsimpleDescription()->String{return"Anequilateraltriaglewithsidesoflength\(sideLength)."}}vartriangle=EquilateralTriangle(sideLength:,name:"atriangle")5960=61注意:赋值器(setter)中,接收的值被自动命名为newValue。willSet和didSetEquilateralTriangle的构造器进行了如下操作:为子类型的属性赋值。调用父类型的构造器。修改父类型的属性。如果不需要计算属性的值,但需要在赋值前后进行一些操作的话,使用willSet和didSet。65classTriangleAndSquare{66vartriangle:EquilateralTriangle{67willSet{68=69}70}71varsquare:Square{72willSet{
7374}75}76init(size:Double,name:String){77square=Square(sideLength:size,name:name)78triangle=EquilateralTriangle(sideLength:size,name:name)79}80}81vartriangleAndSquare=TriangleAndSquare(size:10,name:"anothertestshape")8283=Square(sideLength:50,name:"largersquare")84从而保证triangle和square拥有相等的sideLength。调用方法numberOfTimes面向外部,timesnumberOfTimes面向外部,times面85classCounter{86varcount:Int=087funcincrementBy(amount:Int,numberOfTimestimes:Int){88count+=amount*times89}90}91varcounter=Counter()92(2,numberOfTimes:7)以在外部使用(第一个参数除外),例如:注意Swift支持为方法参数取别名:在上面的代码里,向内部。的另一种用途使用可空值时,可以出现在方法、属性或下标前面。如果前的值为nil,那么后面的表达式会被忽略,而原表达式直接返回nil,例如:letoptionalSquare:Square=Square(sideLength:,name:"optionalsquare")letsideLength=optionalSquare.sideLength当optionalSquare为nil时,sideLength属性调用会被忽略。枚举和结构枚举使用enum创建枚举 注意Swift的枚举可以关联方法:enumRank:Int{97caseAce=198caseTwo,Three,Four,Five,Six,Seven,Eight,Nine,Ten99caseJack,Queen,King100funcsimpleDescription()->String{101switchself{102case.Ace:103return"ace"104case.Jack:105return"jack"106case.Queen:107return"queen"
108case.King:109return"king"110default:111returnString())108case.King:109return"king"110default:111returnString())}}}letace=letaceRawValue=()使用toRaw和fromRaw在原始(raw)数值和枚举值之间进行转换:ifletconvertedRank=(3){letthreeDescription=()}注意枚举中的成员值(membervalue)是实际的值(actualvalue),和原始值(rawvalue)没有必然关联。一些情况下枚举不存在有意义的原始值,这时可以直接忽略原始值:enumSuit{caseSpades,Hearts,Diamonds,ClubsfuncsimpleDescription()->String{switchself{case.Spades:return"spades"case.Hearts:return"hearts"case.Diamonds:return"diamonds"case.Clubs:132}133}131return"clubs"}lethearts=letheartsDescription=()除了可以关联方法,枚举还支持在其成员上关联值,同一枚举的不同成员可以有不同的关联的值:enumServerResponse{138caseResult(String,String)139caseError(String)140}141142letsuccess=("6:00am","8:09pm")143letfailure=("Outofcheese.")144145switchsuccess{146caselet.Result(sunrise,sunset):147letserverResponse="Sunriseisat\(sunrise)andsunsetisat\(sunset)."148caselet.Error(error):149letserverResponse="Failure...\(error)"}结构Swift使用struct关键字创建结构。结构支持构造器和方法这些类的特性。结构和类的最reference)。structCard{varrank:Rankvarsuit:SuitfuncsimpleDescription()->String{return"The\())of\())"}157}158letthreeOfSpades=Card(rank:.Three,suit:.Spades)159letthreeOfSpadesDescription=()协议(protocol)和扩展(extension)协议Swift使用protocol定义协议:protocolExampleProtocol{varsimpleDescription:String{get}mutatingfuncadjust()4}类型、枚举和结构都可以实现(adopt)协议:classSimpleClass:ExampleProtocol{varsimpleDescription:String="Averysimpleclass."varanotherProperty:Int=69105funcadjust(){
vara=SimpleClass()()letaDescription=structSimpleStru
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 消化道穿孔护理查房
- 继电器封装工岗前生产安全意识考核试卷含答案
- 电影摄影设备装配调试工安全管理模拟考核试卷含答案
- 宝剑工安全专项评优考核试卷含答案
- 燃气轮机运行值班员操作水平测试考核试卷含答案
- 医学26年:EMR操作规范解读 查房课件
- 26年检测受试者保护要点
- 医学26年:肝功能结果解读技巧 查房课件
- 2026 减脂期肉干课件
- 人工智能技术入门到创新
- 苹果公司采购部面试题目及答案
- 金属硅购销合同范本
- 工业渗滤液处理运营保障措施方案
- 雨课堂学堂在线学堂云《机电设备管理江西交职》单元测试考核答案
- 中海大卫星海洋学课件第6章 水色遥感和辐射计
- 北京市第七届中小学生气象知识竞赛题及答案
- 数字经济赋能传统产业转型路径分析
- GB/T 12221-2025金属阀门结构长度
- 雨课堂学堂云在线《焊接结构(西安石大 )》单元测试考核答案
- 万用表原理及使用方法
- 5年(2021-2025)重庆中考物理真题分类汇编:专题24 力学实验(二)(解析版)
评论
0/150
提交评论