swift语言介绍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=2whilenstring{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{returnnumberintinletresult=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(item:itemtypetimes:int)->itemtype[]{varresult=itemtype[]()foriin0..times{result+=item}returnresult}repeat("knock"4)swift也支持在类、枚举和结构中使用泛型:
1234567//reimplementtheswiftstandardlibrarysoptionaltypeenumoptionalvalue{casenonecasesome(t)}varpossibleinteger:optionalvalue=.nonepossibleinteger=.some(100)有时需要对泛型做一些需求(requirements),比如需求某个泛型类型实现某个接口或继承自某个特定类型、两个泛型类型属于同一个类型等等,swift通过where描述这些需求:
1234567891011funcanycommonelements(lhs:trhs:u)->bool{forlhsiteminlhs{forrhsiteminrhs{iflhsitem==rhsitem{returntrue}}}returnfalse}anycommonelements([123][3])swift语言概览就到这里,有兴趣的朋友请进一步阅读theswiftprogramminglanguage。
接下来聊聊个人对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——作为开发者,我很高兴能够见证一门编程语言的诞生。
以上。
媒体评测:
一、Swift降低了开发者的使用门槛
Swift语言非常契合本届WWDC的slogan:Write the code,change the world。
(写代码,改变世界)。
Swift这个新的语言集中了很多其它高级语言的影子,集成了他们的优点。
它和Go、Ruby、Python等语言都有些神似。
并且它的语法更加接近自然语言,使得编程的过程变得更加简单。
这些变化进一步降低了苹果平台上App开发门槛,延续苹果一贯主张的用App来解决一切问题。
这将是苹果生态链中重要的一个环节。
随Swift的推出的新版集成开发环境Xcode已经完全支持使用Swift。
Xcode所附带的在线文档中也在原有的Objective-C内容的旁边放上了Swift的说明,可见苹果是多么重视Swift的发展。
这也正好印证了前面提到的,苹果在降低自己生态链中最总要一环的门槛,这会使得苹果自身的竞争力进一步加强。
二、Swift语言还有不完善之处
目前看来,Swift还不够完善,比如支持的复杂数据结构比较有限,可以使用的第三方库也较少。
但是它的出现,代表着接近自然语言语法的编程方法正在快速的发展,让大家看见一个美好的未来:每个希望编写App的人都可以很容易上手,并快速开发出相当不错的App。
当然,Swift也会带来许多局限性,如跨平台等问题等:和Objective-C一样,基于LLVM编译器的它目前是无法在Android、Windows Phone上工作。
所以目前对跨平台的App开发者来说,它肯定不会是首选。
并且,从逆向工程的角度来看,Swift和Objective-C共享运行时函数,让它看起来更像一个Objective-C优雅的包装。
三、是一次编程语言的革新
Swift语言中的Playground功能是一大亮点。
Playground的实时编译和显示结果使得编程变得更加平民化和有趣。
并且这种创新的交互式编程方法很可能会被延展到教育领域。
说不定哪天大学里面枯燥乏味的语言和算法课程就被这种直观的形式所颠覆。
总体来说,Swift的前景是美好的。
Swift的语法相当简单。
综合了很多优秀计算机语言的优点。
随着Swift语言的逐渐成熟,会赢得更多开发者的支持。
Swift 语言的基本运算符:
运算符(operator)是用于检查、更改或组合值的特殊符号或短语。
例如,加法运算符(+)求两个数字的加和(用例let i = 1 + 2)。
更复杂的例子包括逻辑与(logical AND)运算符&&(用例if 已输入门禁密码 && 已通过视网膜扫描) 以及自增运算符++i,后者是将i存储的值加上1的便捷写法。
Swift 支持标准 C 的大多数运算符,并改进了部分行为特性,以避免常见的编码错误。
赋值运算符(=)不会返回值,这样可避免在打算使用等于运算符(==)的地方误用前者。
算术运算符(+、-、*、/、%等)会侦测并阻止值溢出,可避免处理超出可存储值域范围的数时出现意料之外的结果。
如果需要支持溢出,可以选用 Swift 的溢出运算符,详见溢出运算符。
与 C 语言不同,Swift 允许对浮点数求余(%)。
Swift 还提供了两种 C 语言没有的区间运算符(a..b与a...b),作为表达值域范围的便捷写法。
本章讲解 Swift 中的常用运算符。
高级运算符一章涉及了 Swift 的高级运算符,并讲解了如何自定义运算符,以及让标准运算符支持自定义类型的运算。
苹果wifi版ipad产品介绍
有点问题的是重量,0.68公斤似乎不太重,但长时间捧着读书,手腕会感觉累。
我估计是电池和玻璃屏导致重量成为一个难以解决的问题。
kindle的重量可能更适合长时间阅读。
iPad读书的感官表现很好,尤其是图文并茂的书籍,E-ink的表现力暂时还不能跟LED相比。
内置了方向传感器和环境光传感器和的iPad,可能会成为游戏的最佳平台之一。
作为一个上网终端,iPad的体验非常好,尤其是不需要大量输入的浏览和简单互动,很方便。
躺在床上的时候,我很不愿意捧着个笔记本,iPad正合适。
9.7 英寸屏幕(1024*768)确实比iPhone的3.5英寸爽多了。
不过体积还是有些大了,反正我是没那么大的口袋装它。
电池不错,一般使用(上网、看视频等)足以支持10小时以上。
目前专门为iPad开发的应用还不多,QQ的iPad版应该算是第一批中文iPad应用。
iPhone应用基本上都可以在iPad上运行,不过有两种运行模式,一是原尺寸模式,在iPad屏幕中间,一是两倍尺寸模式,基本上可以全屏,不过文字、图像都有些模糊。
连接Time Capsule的802.11n,完全没问题,信号很好。
另外,也没所谓的发热问题,至少并不比iPhone更热。
产品参数【苹果 iPad 主要性能】产品类型: UMPC处理器型号: 1GHz A4处理器标配内存容量: 16GB【苹果 iPad 硬盘/光驱】硬盘容量: 16G【苹果 iPad 显卡/音效】音频系统: 内置扬声器和麦克风【苹果 iPad 显示屏】屏幕尺寸: 9.700屏幕分辨率: 1024768屏幕描述: 多点触摸IPS屏,防指纹涂层,LED【苹果 iPad 尺寸/重量】重量: 680.000外形尺寸: 242.8189.713.4mm外壳材质: 复合材质外壳描述: 机身厚度:1.27厘米【苹果 iPad 网络通信】无线网卡: 支持802.11a/b/g/n无线协议支持蓝牙: 支持【苹果 iPad 接口】视频输出: VGA其他接口: 3.5毫米耳机插孔,苹果Dock接口【苹果 iPad 电源描述】电池类型: 锂电池续航时间: 约10小时(连续) 苹果,wifi,版,ipad,产品,介绍,产品,名称,苹果,
win10系统如何取消开机密码的详细介绍
1、首先在 Win10 系统中,用鼠标右键点击开始按钮,然后再选择“计算机管理”选项,如图所示:2、接下来在计算机管理窗口中,点击左侧的“本地用户和组”选项,如图所示:3、随后在用户中,找到当前所使用的用户账号,如图所示:4、接下来点击鼠标右键并选择“设置密码”选项,如图所示:5、随后会显示一些提示信息,请点击“继续”按钮继续,如图所示:6、接下来请直接点击“确定”按钮,即为当前用户设置一个空密码,然后就可以实现自动登录,不用输入密码了。
以上就是win10如何取消开机密码的详细介绍啦,希望能帮助到大家。
win10系统如何取消开机密码,win10系统,电脑开机密码怎么取消