Swift概览

Swift概览,第1张

概述[javascript] view plain copy print ? <pre name="code" class="objc">转自:http://letsswift.com/2014/06/swift_overview/   Swift语言概览 基本概念 注:这一节的代码源自 The Swift Programming Language中的A Swift Tour。 Hello, worl [JavaScript] view plain copy print ? <prename="code"class="objc">转自:http://letsswift.com/2014/06/swift_overvIEw/ Swift语言概览 基本概念 注:这一节的代码源自 The Swift Programming Language中的A Swift Tour。 Hello,world 类似于脚本语言,下面的代码即是一个完整的Swift程序。 [objc] view plain copy print ? println("Hello,world")
变量与常量
Swift使用var声明变量,let声明常量。 [objc] view plain copy print ? varmyVariable=42 myVariable=50 letmyConstant=42
类型推导 Swift支持类型推导(Type Inference),所以上面的代码不需指定类型,如果需要指定类型: [objc] view plain copy print ? letexplicitDouble:Double=70 Swift不支持隐式类型转换(Implicitly casting),所以下面的代码需要显式类型转换(Explicitly casting): [objc] view plain copy print ? letlabel="ThewIDthis" letwIDth=94 letwIDth=label+String(wIDth)
字符串格式化 Swift使用\(item)的形式进行字符串格式化: [objc] view plain copy print ? letapples=3 letoranges=5 letappleSummary="Ihave\(apples)apples." letappleSummary="Ihave\(apples+oranges)pIEcesoffruit."
数组和字典 Swift使用[] *** 作符声明数组(array)和字典(dictionary): [objc] view plain copy print ? varshopPingList=["catfish","water","tulips","bluepaint"] shopPingList[1]="bottleofwater" varoccupations=[ "Malcolm":"Captain", "Kaylee":"Mechanic", ] occupations["Jayne"]="PublicRelations"
一般使用初始化器(initializer)语法创建空数组和空字典: [objc] view plain copy print ? letemptyArray=String[]() letemptyDictionary=Dictionary<String,float>()
如果类型信息已知,则可以使用[]声明空数组,使用[:]声明空字典。 控制流 概览 Swift的条件语句包含if和switch,循环语句包含for-in、for、while和do-while,循环/判断条件不需要括号,但循环/判断体(body)必需括号: [objc] view plain copy print ? letindivIDualscores=[75,43,103,87,12] varteamscore=0 forscoreinindivIDualscores{ ifscore>50{ teamscore+=3 }else{ teamscore+=1 } }
可空类型 结合if和let,可以方便的处理可空变量(nullable variable)。对于空值,需要在类型声明后添加?显式标明该类型可空。 [objc] view plain copy print ? varoptionalString:String?="Hello" optionalString==nil varoptionalname:String?="JohnAppleseed" vargretting="Hello!" ifletname=optionalname{ gretting="Hello,\(name)" }
灵活的switch Swift中的switch支持各种各样的比较 *** 作: [objc] view plain copy print ? letvegetable="redpepper" switchvegetable{ case"celery": letvegetableComment="Addsomeraisinsandmakeantsonalog." case"cucumber","watercress": letvegetableComment="ThatwouldmakeagoodteasanDWich." caseletxwherex.hasSuffix("pepper"): letvegetableComment="Isitaspicy\(x)?" default: letvegetableComment="Everythingtastesgoodinsoup." }
其它循环 for-in除了遍历数组也可以用来遍历字典: [objc] view plain copy print ? letinterestingNumbers=[ "Prime":[2,3,5,7,11,13], "Fibonacci":[1,1,2,8], "Square":[1,4,9,16,25], ] varlargest=0 for(kind,numbers)ininterestingNumbers{ fornumberinnumbers{ ifnumber>largest{ largest=number } } } largest
while循环和do-while循环: [objc] view plain copy print ? varn=2 whilen<100{ n=n*2 } n varm=2 do{ m=m*2 }whilem<100 m
Swift支持传统的for循环,此外也可以通过结合..(生成一个区间)和for-in实现同样的逻辑。 [objc] view plain copy print ? varfirstForLoop=0 foriin0..3{ firstForLoop+=i } firstForLoop varsecondForLoop=0 forvari=0;i<3;++i{ secondForLoop+=1 } secondForLoop
注意:Swift除了..还有…:..生成前闭后开的区间,而…生成前闭后闭的区间。 函数和闭包 函数 Swift使用func关键字声明函数: [objc] view plain copy print ? funcgreet(name:String,day:String)->String{ return"Hello\(name),todayis\(day)." } greet("Bob","Tuesday")
通过元组(Tuple)返回多个值: [objc] view plain copy print ? funcgetGasPrices()->(Double,Double,Double){ return(3.59,3.69,3.79) } getGasPrices()
支持带有变长参数的函数: [objc] view plain copy print ? funcsumOf(numbers:Int...)->Int{ varsum=0 fornumberinnumbers{ sum+=number } returnsum } sumOf() sumOf(42,597,12)
函数也可以嵌套函数: [objc] view plain copy print ? funcreturnFifteen()->Int{ vary=10 funcadd(){ y+=5 } add() returny }
作为头等对象,函数既可以作为返回值,也可以作为参数传递: [objc] view plain copy print ? funcmakeIncrementer()->(Int->Int){ funcaddOne(number:Int)->Int{ return1+number } returnaddOne } varincrement=makeIncrementer() increment(7)
[objc] view plain copy print ? funchasAnyMatches(List:Int[],condition:Int->Bool)->Bool{ foriteminList{ ifcondition(item){ returntrue } } returnfalse } funclessthanTen(number:Int)->Bool{ returnnumber<10 } varnumbers=[20,19,12] hasAnyMatches(numbers,lessthanTen)
闭包 本质来说,函数是特殊的闭包,Swift中可以利用{}声明匿名闭包: [objc] view plain copy print ? numbers.map({ (number:Int)->Intin letresult=33*number returnresult })
当闭包的类型已知时,可以使用下面的简化写法: [objc] view plain copy print ? numbers.map({numberin33*number})
此外还可以通过参数的位置来使用参数,当函数最后一个参数是闭包时,可以使用下面的语法: [objc] view plain copy print ? sort([1,12,2]){$0>$1}
类和对象 创建和使用类 Swift使用class创建一个类,类可以包含字段和方法: [objc] view plain copy print ? classShape{ varnumberOfSIDes=0 funcsimpleDescription()->String{ return"Ashapewith\(numberOfSIDes)sIDes." } }
创建Shape类的实例,并调用其字段和方法。 [objc] view plain copy print ? varshape=Shape() shape.numberOfSIDes=7 varshapeDescription=shape.simpleDescription()

通过init构建对象,既可以使用self显式引用成员字段(name),也可以隐式引用(numberOfSIDes)。 [objc] view plain copy print ? classnamedShape{ varnumberOfSIDes:Int=0 varname:String init(name:String){ self.name=name } funcsimpleDescription()->String{ return"Ashapewith\(numberOfSIDes)sIDes." } }
使用deinit进行清理工作。 继承和多态 Swift支持继承和多态(overrIDe父类方法): [objc] view plain copy print ? classSquare:namedShape{ varsIDeLength:Double init(sIDeLength:Double,name:String){ self.sIDeLength=sIDeLength super.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字段: [objc] view plain copy print ? classEquilateralTriangle:namedShape{ varsIDeLength:Double=0.0 init(sIDeLength:Double,name:String){ self.sIDeLength=sIDeLength super.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.perimeter triangle.perimeter=9.9 triangle.sIDeLength
注意:赋值器(setter)中,接收的值被自动命名为newValue。 willSet和dIDSet EquilateralTriangle的构造器进行了如下 *** 作: 1.为子类型的属性赋值。 2.调用父类型的构造器。 3.修改父类型的属性。 如果不需要计算属性的值,但需要在赋值前后进行一些 *** 作的话,使用willSet和dIDSet: [objc] view plain copy print ? 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.sIDeLength triangleAndSquare.square=Square(sIDeLength:50,name:"largersquare") triangleAndSquare.triangle.sIDeLength
从而保证triangle和square拥有相等的sIDeLength。 调用方法 Swift中,函数的参数名称只能在函数内部使用,但方法的参数名称除了在内部使用外还可以在外部使用(第一个参数除外),例如: [objc] view plain copy print ? classCounter{ varcount:Int=0 funcincrementBy(amount:Int,numberOfTimestimes:Int){ count+=amount*times } } varcounter=Counter() counter.incrementBy(2,numberOfTimes:7)
注意Swift支持为方法参数取别名:在上面的代码里,numberOfTimes面向外部,times面向内部。 ?的另一种用途 使用可空值时,?可以出现在方法、属性或下标前面。如果?前的值为nil,那么?后面的表达式会被忽略,而原表达式直接返回nil,例如: [objc] view plain copy print ? letoptionalSquare:Square?=Square(sIDeLength:2.5,name:"optional square") letsIDeLength=optionalSquare?.sIDeLength
当optionalSquare为nil时,sIDeLength属性调用会被忽略。 枚举和结构 枚举 使用enum创建枚举——注意Swift的枚举可以关联方法: [objc] view plain copy print ? enumRank:Int{ caseAce=1 caseTwo,Three,Four,Five,Six,Seven,Eight,Nine,Ten caseJack,Queen,King funcsimpleDescription()->String{ switchself{ case.Ace: return"ace" case.Jack: return"jack" case.Queen: return"queen" case.King: return"king" default: returnString(self.toRaw()) } } } letace=Rank.Ace letaceRawValue=ace.toRaw()
使用toRaw和fromraw在原始(raw)数值和枚举值之间进行转换: [objc] view plain copy print ? ifletconvertedRank=Rank.fromraw(3){ letthreeDescription=convertedRank.simpleDescription() }
注意:枚举中的成员值(member value)是实际的值(actual value),和原始值(raw value)没有必然关联。 一些情况下枚举不存在有意义的原始值,这时可以直接忽略原始值: [objc] view plain copy print ? enumSuit{ caseSpades,Hearts,Diamonds,Clubs funcsimpleDescription()->String{ switchself{ case.Spades: return"spades" case.Hearts: return"hearts" case.Diamonds: return"diamonds" case.Clubs: return"clubs" } } } lethearts=Suit.Hearts letheartsDescription=hearts.simpleDescription()
除了可以关联方法,枚举还支持在其成员上关联值,同一枚举的不同成员可以有不同的关联的值: [objc] view plain copy print ? 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关键字创建结构。结构支持构造器和方法这些类的特性。结构和类的最大区别在于:结构的实例按值传递(passed by value),而类的实例按引用传递(passed by reference)。 [objc] view plain copy print ? structCard{ varrank:Rank varsuit:Suit funcsimpleDescription()->String{ return"The\(rank.simpleDescription())of\(suit.simpleDescription())" } } letthreeOfSpades=Card(rank:.Three,suit:.Spades) letthreeOfSpadesDescription=threeOfSpades.simpleDescription() 协议(protocol)和扩展(extension) 协议 Swift使用protocol定义协议: [objc] view plain copy print ? protocolExampleProtocol{ varsimpleDescription:String{get} mutatingfuncadjust() }
类型、枚举和结构都可以实现(adopt)协议: [objc] view plain copy print ? classSimpleClass:ExampleProtocol{ varsimpleDescription:String="Averysimpleclass." varanotherProperty:Int=69105 funcadjust(){ simpleDescription+="Now100%adjusted." } } vara=SimpleClass() a.adjust() letaDescription=a.simpleDescription structSimpleStructure:ExampleProtocol{ varsimpleDescription:String="Asimplestructure" mutatingfuncadjust(){ simpleDescription+="(adjusted)" } } varb=SimpleStructure() b.adjust() letbDescription=b.simpleDescription
扩展 扩展用于在已有的类型上增加新的功能(比如新的方法或属性),Swift使用extension声明扩展: [objc] view plain copy print ? extensionInt:ExampleProtocol{ varsimpleDescription:String{ return"Thenumber\(self)" } mutatingfuncadjust(){ self+=42 } } 7.simpleDescription
泛型(generics) Swift使用<>来声明泛型函数或泛型类型: [objc] view plain copy print ? funcrepeat(item:ItemType,times:Int)->ItemType[]{ varresult=ItemType[]() foriin0..times{ result+=item } returnresult } repeat("knock",4)
Swift也支持在类、枚举和结构中使用泛型: [objc] view plain copy print ? //ReimplementtheSwiftstandardlibrary'soptionaltype enumOptionalValue{ caseNone caseSome(T) } varpossibleInteger:OptionalValue=.None possibleInteger=.some(100)
有时需要对泛型做一些需求(requirements),比如需求某个泛型类型实现某个接口或继承自某个特定类型、两个泛型类型属于同一个类型等等,Swift通过where描述这些需求: [objc] view plain copy print ? funcanyCommonElements<T,UwhereT:Sequence,U:Sequence,T.GeneratorType.Element:Equatable,T.GeneratorType.Element==U.GeneratorType.Element>(lhs:T,rhs:U)->Bool{ forlhsIteminlhs{ forrhsIteminrhs{ iflhsItem==rhsItem{ returntrue } } } returnfalse } anyCommonElements([1,3],[3])

本文转自 Lucida的博客 感谢原作者 总结

以上是内存溢出为你收集整理的Swift概览全部内容,希望文章能够帮你解决Swift概览所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/web/1076046.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存