菜鸟软件园的小编zzz精心为您带来了swift语言介绍的教程,希望你们能喜欢!
swift是什么?
swift是苹果于wwdc2014发布的编程语言,这里引用theswiftprogramminglanguage的原话:
swiftisanewprogramminglanguageforiosandosxappsthatbuildsonthebestofcandobjective-cwithouttheconstraintsofccompatibility.
swiftadoptssafeprogrammingpatternsandaddsmodernfeaturestomakeprogrammingeasiermoreflexibleandmorefun.
swift’scleanslatebackedbythematureandmuch-lovedcocoaandcocoatouchframeworksisanopportunitytoimaginehowsoftwaredevelopmentworks.
swiftisthefirstindustrial-qualitysystemsprogramminglanguagethatisasexpressiveandenjoyableasascriptinglanguage.
简单的说:
swift用来写ios和osx程序。(估计也不会支持其它屌丝系统)swift吸取了c和objective-c的优点,且更加强大易用。swift可以使用现有的cocoa和cocoatouch框架。swift兼具编译语言的高性能(performance)和脚本语言的交互性(interactive)。swift语言概览
基本概念
注:这一节的代码源自theswiftprogramminglanguage中的aswifttour。
helloworld
类似于脚本语言,下面的代码即是一个完整的swift程序。
1println("helloworld")变量与常量
swift使用var声明变量,let声明常量。
123varmyvariable=42myvariable=50letmyconstant=42类型推导
swift支持类型推导(typeinference),所以上面的代码不需指定类型,如果需要指定类型:
1letexplicitdouble:double=70swift不支持隐式类型转换(implicitlycasting),所以下面的代码需要显式类型转换(explicitlycasting):
123letlabel="thewidthis"letwidth=94letwidth=label+string(width)字符串格式化
swift使用\(item)的形式进行字符串格式化:
1234letapples=3letoranges=5letapplesummary="ihave\(apples)apples."letapplesummary="ihave\(apples+oranges)piecesoffruit."数组和字典
swift使用[]操作符声明数组(array)和字典(dictionary):
12345678varshoppinglist=["catfish""water""tulips""bluepaint"]shoppinglist[1]="bottleofwater"
varoccupations=["malcolm":"captain""kaylee":"mechanic"]occupations["jayne"]="publicrelations"一般使用初始化器(initializer)语法创建空数组和空字典:
12letemptyarray=string[]()letemptydictionary=dictionary
控制流
概览
swift的条件语句包含if和switch,循环语句包含for-in、for、while和do-while,循环/判断条件不需要括号,但循环/判断体(body)必需括号:
123456789letindividualscores=[75431038712]varteamscore=0forscoreinindividualscores{ifscore>50{teamscore+=3}else{teamscore+=1}}可空类型
结合if和let,可以方便的处理可空变量(nullablevariable)。对于空值,需要在类型声明后添加?显式标明该类型可空。
12345678varoptionalstring:string?="hello"optionalstring==nil
varoptionalname:string?="johnappleseed"vargretting="hello!"ifletname=optionalname{gretting="hello\(name)"}灵活的switch
swift中的switch支持各种各样的比较操作:
1234567891011letvegetable="redpepper"switchvegetable{case"celery":letvegetablecomment="addsomeraisinsandmakeantsonalog."case"cucumber""watercress":letvegetablecomment="thatwouldmakeagoodteasandwich."caseletxwherex.hassuffix("pepper"):letvegetablecomment="isitaspicy\(x)?"default:letvegetablecomment="everythingtastesgoodinsoup."}其它循环
for-in除了遍历数组也可以用来遍历字典:
1234567891011121314letinterestingnumbers=["prime":[23571113]"fibonacci":[112358]"square":[1491625]]varlargest=0for(kindnumbers)ininterestingnumbers{fornumberinnumbers{ifnumber>largest{largest=number}}}largestwhile循环和do-while循环:
1234567891011varn=2whilen<100{n=n2}n
varm=2do{m=m2}whilem<100mswift支持传统的for循环,此外也可以通过结合..(生成一个区间)和for-in实现同样的逻辑。
1234567891011varfirstforloop=0foriin0..3{firstforloop+=i}firstforloop
varsecondforloop=0forvari=0i<3++i{secondforloop+=1}secondforloop注意:swift除了..还有...:..生成前闭后开的区间,而...生成前闭后闭的区间。
函数和闭包
函数
swift使用func关键字声明函数:
1234funcgreet(name:stringday:string)->string{return"hello\(name)todayis\(day)."}greet("bob""tuesday")通过元组(tuple)返回多个值:
1234funcgetgasprices()->(doubledoubledouble){return(3.593.693.79)}getgasprices()支持带有变长参数的函数:
123456789funcsumof(numbers:int...)->int{varsum=0fornumberinnumbers{sum+=number}returnsum}sumof()sumof(4259712)函数也可以嵌套函数:
123456789funcreturnfifteen()->int{vary=10funcadd(){y+=5}add()returny}returnfifteen()作为头等对象,函数既可以作为返回值,也可以作为参数传递:
12345678funcmakeincrementer()->(int->int){funcaddone(number:int)->int{return1+number}returnaddone}varincrement=makeincrementer()increment(7)12345678910111213funchasanymatches(list:int[]condition:int->bool)->bool{foriteminlist{ifcondition(item){returntrue}}returnfalse}funclessthanten(number:int)->bool{returnnumber<10}varnumbers=[2019712]hasanymatches(numberslessthanten)闭包
本质来说,函数是特殊的闭包,swift中可以利用{}声明匿名闭包:
12345numbers.map({(number:int)->intinletresult=3numberreturnresult})当闭包的类型已知时,可以使用下面的简化写法:
1numbers.map({numberin3number})此外还可以通过参数的位置来使用参数,当函数最后一个参数是闭包时,可以使用下面的语法:
1sort([153122]){$0>$1}类和对象
创建和使用类
swift使用class创建一个类,类可以包含字段和方法:
123456classshape{varnumberofsides=0funcsimpledescription()->string{return"ashapewith\(numberofsides)sides."}}创建shape类的实例,并调用其字段和方法。
123varshape=shape()shape.numberofsides=7varshapedescription=shape.simpledescription()通过init构建对象,既可以使用self显式引用成员字段(name),也可以隐式引用(numberofsides)。
123456789101112classnamedshape{varnumberofsides:int=0varname:string
init(name:string){self.name=name}
funcsimpledescription()->string{return"ashapewith\(numberofsides)sides."}}使用deinit进行清理工作。
继承和多态
swift支持继承和多态(override父类方法):
1234567891011121314151617181920classsquare:namedshape{varsidelength:double
init(sidelength:doublename:string){self.sidelength=sidelengthsuper.init(name:name)numberofsides=4}
funcarea()->double{returnsidelengthsidelength}
overridefuncsimpledescription()->string{return"asquarewithsidesoflength\(sidelength)."}}lettest=square(sidelength:5.2name:"mytestsquare")test.area()test.simpledescription()注意:如果这里的simpledescription方法没有被标识为override,则会引发编译错误。
属性
为了简化代码,swift引入了属性(property),见下面的perimeter字段:
1234567891011121314151617181920212223242526classequilateraltriangle:namedshape{varsidelength:double=0.0
init(sidelength:doublename:string){self.sidelength=sidelengthsuper.init(name:name)numberofsides=3}
varperimeter:double{get{return3.0sidelength}set{sidelength=newvalue/3.0}}
overridefuncsimpledescription()->string{return"anequilateraltriaglewithsidesoflength\(sidelength)."}}vartriangle=equilateraltriangle(sidelength:3.1name:"atriangle")triangle.perimetertriangle.perimeter=9.9triangle.sidelength注意:赋值器(setter)中,接收的值被自动命名为newvalue。
willset和didset
equilateraltriangle的构造器进行了如下操作:
为子类型的属性赋值。调用父类型的构造器。修改父类型的属性。如果不需要计算属性的值,但需要在赋值前后进行一些操作的话,使用willset和didset:
1234567891011121314151617181920classtriangleandsquare{vartriangle:equilateraltriangle{willset{square.sidelength=newvalue.sidelength}}varsquare:square{willset{triangle.sidelength=newvalue.sidelength}}init(size:doublename:string){square=square(sidelength:sizename:name)triangle=equilateraltriangle(sidelength:sizename:name)}}vartriangleandsquare=triangleandsquare(size:10name:"anothertestshape")triangleandsquare.square.sidelengthtriangleandsquare.square=square(sidelength:50name:"largersquare")triangleandsquare.triangle.sidelength从而保证triangle和square拥有相等的sidelength。
调用方法
swift中,函数的参数名称只能在函数内部使用,但方法的参数名称除了在内部使用外还可以在外部使用(第一个参数除外),例如:
12345678classcounter{varcount:int=0funcincrementby(amount:intnumberoftimestimes:int){count+=amounttimes}}varcounter=counter()counter.incrementby(2numberoftimes:7)注意swift支持为方法参数取别名:在上面的代码里,numberoftimes面向外部,times面向内部。
?的另一种用途
使用可空值时,?可以出现在方法、属性或下标前面。如果?前的值为nil,那么?后面的表达式会被忽略,而原表达式直接返回nil,例如:
123letoptionalsquare:square?=square(sidelength:2.5name:"optionalsquare")letsidelength=optionalsquare?.sidelength当optionalsquare为nil时,sidelength属性调用会被忽略。
枚举和结构
枚举
使用enum创建枚举——注意swift的枚举可以关联方法:
123456789101112131415161718192021enumrank:int{caseace=1casetwothreefourfivesixseveneightninetencasejackqueenkingfuncsimpledescription()->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)数值和枚举值之间进行转换:
123ifletconvertedrank=rank.fromraw(3){letthreedescription=convertedrank.simpledescription()}注意枚举中的成员值(membervalue)是实际的值(actualvalue),和原始值(rawvalue)没有必然关联。
一些情况下枚举不存在有意义的原始值,这时可以直接忽略原始值:
1234567891011121314151617enumsuit{casespadesheartsdiamondsclubsfuncsimpledescription()->string{switchself{case.spades:return"spades"case.hearts:return"hearts"case.diamonds:return"diamonds"case.clubs:return"clubs"}}}lethearts=suit.heartsletheartsdescription=hearts.simpledescription()除了可以关联方法,枚举还支持在其成员上关联值,同一枚举的不同成员可以有不同的关联的值:
1234567891011121314enumserverresponse{caseresult(stringstring)caseerror(string)}
letsuccess=serverresponse.result("6:00am""8:09pm")letfailure=serverresponse.error("outofcheese.")
switchsuccess{caselet.result(sunrisesunset):letserverresponse="sunriseisat\(sunrise)andsunsetisat\(sunset)."caselet.error(error):letserverresponse="failure...\(error)"}结构
swift使用struct关键字创建结构。结构支持构造器和方法这些类的特性。结构和类的最大区别在于:结构的实例按值传递(passedbyvalue),而类的实例按引用传递(passedbyreference)。
123456789structcard{varrank:rankvarsuit:suitfuncsimpledescription()->string{return"the\(rank.simpledescription())of\(suit.simpledescription())"}}letthreeofspades=card(rank:.threesuit:.spades)letthreeofspadesdescription=threeofspades.simpledescription()协议(protocol)和扩展(extension)
协议
swift使用protocol定义协议:
1234protocolexampleprotocol{varsimpledescription:string{get}mutatingfuncadjust()}类型、枚举和结构都可以实现(adopt)协议:
1234567891011121314151617181920classsimpleclass:exampleprotocol{varsimpledescription:string="averysimpleclass."varanotherproperty:int=69105funcadjust(){simpledescription+="now100adjusted."}}vara=simpleclass()a.adjust()letadescription=a.simpledescription
structsimplestructure:exampleprotocol{varsimpledescription:string="asimplestructure"mutatingfuncadjust(){simpledescription+="(adjusted)"}}varb=simplestructure()b.adjust()letbdescription=b.simpledescription扩展
扩展用于在已有的类型上增加新的功能(比如新的方法或属性),swift使用extension声明扩展:
123456789extensionint:exampleprotocol{varsimpledescription:string{return"thenumber\(self)"}mutatingfuncadjust(){self+=42}}7.simpledescription泛型(generics)
swift使用<>来声明泛型函数或泛型类型:
12345678funcrepeat
1234567//reimplementtheswiftstandardlibrarysoptionaltypeenumoptionalvalue
1234567891011funcanycommonelements
接下来聊聊个人对swift的一些感受。
个人感受
注意:下面的感受纯属个人意见,仅供参考。
大杂烩
尽管我接触swift不足两小时,但很容易看出swift吸收了大量其它编程语言中的元素,这些元素包括但不限于:
属性(property)、可空值(nullabletype)语法和泛型(generictype)语法源自c#。格式风格与go相仿(没有句末的分号,判断条件不需要括号)。python风格的当前实例引用语法(使用self)和列表字典声明语法。haskell风格的区间声明语法(比如1..3,1...3)。协议和扩展源自objective-c(自家产品随便用)。枚举类型很像java(可以拥有成员或方法)。class和struct的概念和c#极其相似。注意这里不是说swift是抄袭——实际上编程语言能玩的花样基本就这些,况且swift选的都是在我看来相当不错的特性。
而且,这个大杂烩有一个好处——就是任何其它编程语言的开发者都不会觉得swift很陌生——这一点很重要。
拒绝隐式(refuseimplicity)
swift去除了一些隐式操作,比如隐式类型转换和隐式方法重载这两个坑,干的漂亮。
swift的应用方向
我认为swift主要有下面这两个应用方向:
教育
我指的是编程教育。现有编程语言最大的问题就是交互性奇差,从而导致学习曲线陡峭。相信swift及其交互性极强的编程环境能够打破这个局面,让更多的人——尤其是青少年,学会编程。
这里有必要再次提到brecvictor的inventingonprinciple,看了这个视频你就会明白一个交互性强的编程环境能够带来什么。
应用开发
现有的ios和osx应用开发均使用objective-c,而objective-c是一门及其繁琐(verbose)且学习曲线比较陡峭的语言,如果swift能够提供一个同现有obj-c框架的简易互操作接口,我相信会有大量的程序员转投swift;与此同时,swift简易的语法也会带来相当数量的其它平台开发者。
总之,上一次某家大公司大张旗鼓的推出一门编程语言及其编程平台还是在2000年(微软推出c#),将近15年之后,苹果推出swift——作为开发者,我很高兴能够见证一门编程语言的诞生。
标签:游戏攻略