《Swift简明教程》由会员分享,可在线阅读,更多相关《Swift简明教程(13页珍藏版)》请在金锄头文库上搜索。
1、Swift?明?程?一?新?言的?候,大家都?于打印“Hello,world”?始。在Swift中只需要一行代?:println(Hello,-world)如果?曾?C或者Objective-C代?,?不?Swift的?法陌生。Swift中上面?一行就是一?完整的程序。?不需要再?入/?出或者字符串?理功能?入?立的?。程序以全局代?作?入口,因此不再需要main函?了。同?,代?尾的分?也不?再出?。再?明?程中,?到足?的知?Swift程序。如果看完?程后?有什?不理解的,?可以在?本?中?到解?。Note最好的?是在Xcode中?本章的?容作?一?Playground打?。Playgro
2、und允?Swift的?行?果。?在Swift中,使用let定?一?常量,var定?量。常量的?不需要在?定,但是只能?一次。?意味着?可以?一?常量?后,多次使用。var-myVariable-=-42myVariable-=-50let-myConstant-=-42?常量或者?量?的?候,?型必?相同。但是?不需要每次都?式的?出?的?型,因?器默?的?定了一些?据的?型。例如上面的代?中myVariable是一?整?型。如果初始?有提供足?的?型信息(或者?有初始?),可以在?量后增加?型?明符。let-implicitInteger-=-70let-implicitDouble-=-
3、70.0let-explicitDouble:-Double-=-70?建一?常量,指定?的?型?Float?4。Swift中的?据?型之?不?行?式的?。如果需要在不同?据?型之?行?的?,需要?式的?建一?目?型的?例。let-label-=-The-width-is-let-width-=-94let-widthLabel-=-label-+-String(width)?除最后一行的String,看看?有什?。长沙戴维营教育iOS培训?上,?有一?更加?的方法?包含到字符串中:把需要包含的?在?括?()中,然后在括?前添加反斜?就可以了,例如:let-apples-=-3let-oran
4、ges-=-5let-appleSummary-=-I-have-(apples)-apples.let-fruitSummary-=-I-have-(apples-+-oranges)-pieces-of-fruit.?在字符串中使用()包含浮点?Swift使用?建和?和字典。var-shoppingList-=-catfish,-water,-tulips,-blue-paintshoppingList1-=-bottle-of-watervar-occupations-=-Malcolm:-Captain,-Kaylee:-Mechanic,occupationsJayne-=-Publ
5、ic-Relations也可以使用初始化?句?建空的?和字典。let-emptyArray-=-String()let-emptyDictionary-=-Dictionary()如果?型信息能?被推?出?,?可以直接?空?,空字典?:。例如?函?的?候。shoppingList-=-/-Went-shopping-and-bought-everything.流程控制使用if和switch?行?件判?,for-in、for、while和do-while?行循?。?件判?的?括?可?的,但是if或者循?的花括?必?的。let-individualScores-=-75,-43,-103,-87,
6、-12var-teamScore-=-0for-score-in-individualScores-if-score-50-teamScore-+=-3-else-teamScore-+=-1-teamScoreif?句中,判?件必?布?表?式,也就是?if score . 的形式是?的,?不?式的?0?行比?。长沙戴维营教育iOS培训?可以使用if和let一起?判?是否缺失。?些?被看作是?(Optionals)。一?包含一?或者nil?表示是否缺失?容。在?型后面添加?一?是一?。var-optionalString:-String?-=-HellooptionalString-=-nil
7、var-optionalName:-String?-=-John-Apppleseedvar-greeting-=-Hello!if-let-name-=-optionalName-greeting-=-Hello,-(name)?optionalName的?改?nil,看一下能不能得到?候。在if后添加else?句,使得optionalName?nil的?候打印不同的?候?句。如果?的?nil,?件?false,if后的?句被跳?。否?的?被?let后的常量,?且?常量的作用域?花括?里面。Swift里的switch?句支持任意?据?型以及比?操作,而不是被限制?整?的相等。let-vege
8、table-=-red-pepperswitch-vegetable-case-celery:-let-vegetableComment-=-Add-some-raisins-and-make-ants-on-a-log.-case-cucumber,-watercress:-let-vegetableComment-=-That-would-make-a-good-tea-sandwich.-case-let-x-where-x.hasSuffix(pepper):-let-vegetableComment-=-Is-it-a-spicy-(x)?-default:-let-vegetabl
9、eComment-=-Everything-tasts-good-in-soup.?移除default?句,看看有什?行完switch的一?case后,程序?switch?句中跳出,而不?行下一?case?句,因此在Swift中不需要?式的使用break跳出每一?分支。在使用for-in?行迭代的?候,每次迭代都?返回一?:let-interestingNumbers-=-Prime:-2,-3,-5,-7,-11,-13,-Fibonacci:-1,-1,-2,-3,-5,-8,-Square:-1,-4,-9,-16,-25,var-largest-=-0for-(kind,-number
10、s)-in-interestingNumbers-for-number-in-numbers-if-number-largest-largetst-=-number-长沙戴维营教育iOS培训largest?增加一?量,?最大?所在的分?while?一直循?行,直到判?件?生?化。如果使用do-while,循?至少?行一次。var-n-=-2while-n-100-n-=-n-*-2nvar-m-=-2do-m-=-m-*-2-while-m-100m在for循?中通?索引?控制循?,其中.用?建一?索引的范?,下面?循?是一?的效果var-firstForLoop-=-0for-i-in-0.
11、3-firstForLoop-+=-ifirstForLoopvar-secondForLoop-=-0for-var-i-=-0;-i-?示。func-greet(name:-String,-day:-String)-j-String-return-Hello-(name),-today-is-(day).greet(Bob,-Tuesday)?移除day?,添加一些?的信息使用元?函?中返回多?。func-getGasPrices()-j-(Double,-Double,-Double)-长沙戴维营教育iOS培训-return-(3.59,-3.69,-3.79)getGasPrices(
12、)Swift的函?可以接受可?。func-sumOf(numbers:-Int.)-j-Int-var-sum-=-0-for-number-in-numbers-sum-+=-number-return-sumsumOf()sumOf(43,-597,-12)?一?算?平均?的函?Swift的函?可以?行嵌套。被嵌套的函?可以?外面函?定?的?量。func-returnFifteen()-j-Int-var-y-=-10-func-add()-y-+=-5-add()-return-yreturnFifteen()Swift中的函?也是基本的?据?型,也就是?可以在一?函?中返回?外一?函?
13、。func-makeIncrementer()-j-(Int-j-Int)-func-addOne(number:-Int)-j-Int-return-1-+-number-return-addOnevar-increment-=-makeIncrementer()increment(7)函?然也可以作?其?函?的?行?。func-hasAnyMatches(list:-Int,-condition:-Int-j-Bool)-j-Bool-for-item-in-list-if-condition(item)-return-true-长沙戴维营教育iOS培训-return-falsefunc-
14、lessThanTen(number:-Int)-j-Bool-return-number-Int-in-let-result-=-3-*-number-return-result)?重?上面的?包,使得所有的奇?都返回0?有?方式可以使得?包的?更加?。?包的?型是已知的,比如作?回?或者代理的?候,?可以省略?型或者返回?型。如下:numbers.map(-number-in-3-*-number-)在?包中?可以使用位置?引用?,?在?非常短的?包的?候比?有用。?包作?函?的最后一?,可以?放在函?的?括?后面。sort(1,-5,-3,-12,-2)-$0-$1-?象Swift中使用
15、class?字定?。?里面?性的?明?定?量和常量差不多,而成?方法也?普通函?的?法一?,只是?在?里面。class-Shape-var-numberOfSides-=-0-func-simpleDescription()-j-String-return-A-shape-with-(numberOfSides)-sides.-?上面的?用let添加一?常量?性,?且增加一?能?接受一?的方法直接在?名后增加?括?就可以?建?的?例,然后通?点操作符?的?性和成?方法。长沙戴维营教育iOS培训var-shape-=-Shape()shape.numberOfSides-=-7var-shape
16、Description-=-shape.simpleDescription()不?上面的Shape?缺少一些重要的?西:在?建?象的?候?行初始化的初始化器。初始化器用init?行定?。class-NameShape-var-numberOfSides:-Int-=-0-var-name:-String-init(name:-String)-self.name-=-name-func-simpleDescription()-j-String-return-A-shape-with-(numberOfSides)-sides.-?里要注意的是init方法中self的用法。初始化方法的?普通的函?
17、似。?中的?性都?行初始化?,不管是在?明的?候?是在初始化器中。deinit是Swift的析?函?,?dealloc?似,用在?象?毁?行?理工作。在?名后使用冒?:和父?的名字表示?承?系,Swift中?不要求每?都有父?。子?使用override?字?重?父?的方法,如果?有?override的?,?出?器?。同?,?器也?有override?字的方法是否?的重?了父?的方法。class-Square-:-NamedShape-var-sideLength:-Double-init(sideLength:-Double,-name:-String)-self.sideLength-=-s
18、ideLength-super.init(name:-name)-numberOfSides-=-4-func-area()-j-Double-return-sideLength-*-sideLength-override-func-simpleDescription()-j-String-return-A-square-with-sides-of-length-(sideLength).-let-test-=-Square(sideLength:-5.2,-name:-my-test-square)test.area()test.simpleDescription()?NamedShape?
19、建一?叫Circle的子?,使?能?接受一?半?和名字作?。然后?area和describe方法。长沙戴维营教育iOS培训?Objective-C?似,Swift?能?性定?getter和setter。class-EquilateralTriangle:-NamedShape-var-sideLength:-Double-=-0.0-init(sideLength:-Double,-name:-String)-self.sideLength-=-sideLength-super.init(name:-name)-numberOfSides-=-3-var-perimeter:-Double-g
20、et-return-3.0-*-sideLength-set-sideLength-=-newValue-/-3.0-override-func-simpleDescription()-j-String-return-An-equilateral-triangle-with-sides-of-length-(sideLength).-var-triangle-=-EquilateralTraingle(sideLength:-3.1,-name:-a-triangle)triangle.perimetertriangle.perimeter-=-9.9triangle.sideLength在p
21、erimeter的?置方法中,新的?默?存放在newValue?量里。?然,也可以?式的在set方法后的?括?中提供?量名字。注意EquilateralTriangle?的初始化器里有三步:1. ?置子?中定?的?性的?。2. ?用父?的初始化器3. 改?父?中定?的?性的?。如果?不需要?算?性的?,但是想要在?性的?生改?之前或者改?后?行一些任?,可以使用willSet和didSet。例如下面的代?可以保?三角形和四?形的?是相同的。class-TriangleAndSquare-var-triangle:-EquilateralTraingle-willSet-square.sideL
22、ength-=-newValue.sideLength-var-square:-Square-willSet-triangle.sideLength-=-newValue.sideLength-长沙戴维营教育iOS培训-init(size?-Double,-name:-String)-square-=-Square(sideLength:-size,-name:-name)-triangle-=-EuilateralTriangle(sideLength:-size,-name:-name)-var-triangleAndSquare-=-TriangleAndSquare(size:-10,
23、-name:-another-test-shape)triangleAndSquare.square.sideLengthtriangleAndSquare.triangle.sideLengthtriangleAndSquare.square-=-Square(sideLength:-50,-name:-larger-square)triangleAndSquare.triangle.sideLength?的成?方法?函?有一?非常重要的?。函?里的?名只能在函?里面使用,而方法的?名可以在?用的?候使用。class-Counter-var-count:-Int-=-0-func-incre
24、mentBy(amount:-Int,-numberOfTimes-times:-Int)-count-+=-amount-*-times-var-counter-=-Counter()counter.imcrementBy(2,-numberOfTimes:-7)使用?(Optional)的?候,可以在方法、?性等操作符前使用?。如果?的?nil?忽略?行?后的表?式,?且整?表?式的?nil。否?就?行?后的表?式。let-optionalSquare:-Square?-=-Square(sideLength:-2.5,-name:-optinal-square)let-sideLengt
25、h-=-optionalSquare?.sideLength枚?使用enum?字?建枚?型。?似,枚?型中一?可以定?方法。enum-Rank:-Int-case-Ace-=-1-case-Two,-Three,-Four,-Five,-Six,-Seven,-Eight,-Nine,-Ten-case-Jack,-Queen,-King-func-simpleDescription()-j-String-switch-self-case-.Ace:-return-ace-case-.Jack:-return-jack-case-.Queen:-return-queen-case-.King:
26、-return-king-default;长沙戴维营教育iOS培训-return-String(self.toRaw()-let-ace-=-Rank.Acelet-aceRawValue-=-ace.toRow()?一?函?用?比?Rank枚?在上面的代?中,枚?型的原始?是Int?型,定?的?候只明?了第一?,后面的依次?增。?然也可以使用浮点?或者字符串作?枚?型的?。使用toRaw和fromRaw可以在枚?型和原始?之?行?。if-let-convertedRank-=-Rank.fromRaw(3)-let-threeDescription-=-convertedRank.simpl
27、eDescription()枚?型成?的?是一?的?,而不?是他?原始?的?外一?法。事?上,?可以不提供有意?的原始?。enum-Suit-case-Spades,-hearts,-Diamonds,-Clubs-func-simpleDescription()-j-String-switch-self-case-.Spades:-return-spades-case-.Hearts:-return-hearts-case-.Diamonds:-return-diamonds-case-.Clubs:-return-clubs-let-hearts-=-Suit.Heartslet-hear
28、tsDescription-=-hearts.simpleDescription()?Suit添加一?color方法,?枚?Spades或者Clubs的?候返回”black”,否?返回”red”。有?方法引用Hearts的成?:?hearts常量?的?候,使用了完整的Suit.Hearts名字,?是因?有?式的?明?常量的?型。而在switch中,因?已?知道self就是Suit?型的?,直接使用.Hearts的?就可以了。?可以在任何已?明?据?型的情?下使用?。Swift使用struct?字?建一?。?在?多方面都是?似的,包括方法和初始化器。?和?最大的不同在于使用?的?候是按?,而?于
29、?是按引用?。struct-Card-var-rank:-Rank长沙戴维营教育iOS培训-var-suit:-Suit-func-simpleDescription()-j-String-return-The-(rank.simpleDescription()-of-(suit.simpleDescription()-let-threeOfSpades-=-Card(rank:-.Three,-suit:-.Spades)let-threeOfSpadesDescription-=-threeOfSpades.simpleDescription()?Card添加一?方法用?建一整套德州?克,
30、其中每?牌都必?包括花色和点?。每?枚?成?都可以?一些?。同一?枚?型的?例成?都能?不同的?。在?建枚?型的?例?可以?枚?成?上一些?。?的?原始的?不一?:同一?枚?型的所有成?中,原始?都是一?的,在定?枚?型的?候就已?定了。例如?服?器上?取日落和日出的?。服?器?返回正?的信息或者出?。enum-ServerResponse-case-Result(String,-String)-case-Error(String)let-success-=-ServerResponse.Result(6:00-am,-8:09-pm)let-failure-=-ServerResponse.
31、Error(Out-of-cheese)switch-success-case-let-.Result(sunrise,-sunset):-let-serverResponse-=-Sunrise-is-at-(sunrise)-and-sunset-is-at-(sunset).-case-let-.Error(error):-let-serverResponse-=-Failure.-(error)?ServerResponse的switch添加第三?case分支。?展使用protocol?字?明?。protocol-ExampleProtocol-var-simpleDescriptio
32、n:-String-get-mutating-func-adjust()?、枚?和?都能?。class-SimpleClass-:-ExampleProtocol-var-simpleDescription:-String-=-A-very-simple-class.-var-anotherProperty:-Int-=-69105-func-adjust()-simpleDescription-+=-Now-100%-adjusted.长沙戴维营教育iOS培训-var-a-=-SimpleClass()a.adjust()let-aDescription-=-a.simpleDescript
33、ionstruct-SimpleStructure:-ExampleProtocol-var-simpleDescription:-String-=-A-simple-structure-mutating-func-adjust()-simpleDescription-+=-(adjusted)-var-b-=-SimpleStructure()b.adjust()let-bDescription-=-b.simpleDescription?定?一?枚?型?上面的?明?SimpleStructure?使用的mutating?字?行修改的方法。由于?中的方法?是可以修改?的?象,因此不需要在Si
34、mpleClass中?行?明。Swift使用extension?字?一?已?存在的?型添加功能。?可以?任何地方?明的?型使用?展,使得?某?,不管?是?架?是其?地方?入的。extension-Int:-ExampleProtocol-var-simpleDescription:-String-return-The-number-(self)-mutating-func-adjust()-self-+=-42-7.simpleDescription?Double?型使用?展添加一?absoluteValue?性。可以像其?据?型一?用?明?量或?常量,例如?建一?象的集合,使得?可以容?可以
35、?同一?的不同?据?型的?。?使用?些?的?候,不能?用?以外的方法。let-protocolValue:-ExampleProtocol-=-aprotocolValue.simpleDescription/protocolVAlue.anotherProperty-/Uncomment-to-see-the-error?管protocolValue?量是SimpleClass的?象,但是?器把?成是ExampleProtocol?型。?就意味着?只能?里定?的方法和?性。泛型长沙戴维营教育iOS培训使用尖括?可以定?泛型函?或?型。func-repeat(item:-ItemType,-t
36、imes:-Int)-j-ItemType-var-result-=-ItemType()-for-i-in-0.times-result-+=-item-return-resultrepeat(knock,-4)同?可以?建泛型?、枚?型和?型。/?Swift?optional?enum-OptionalValue-case-None-case-Some(T)var-possibleInteger:-OptionalValue-=-.NonepossibleInteger-=-.Some(100)使用where?字可以?泛型添加一?限制列表,例如:?型必?相同、必?某?、必?是某?的子?等。func-anyCommonElements-(lhs:-T,-rhs:-U)-j-Bool-for-lhsItem-in-lhs-for-rhsItem-in-rhs-if-lhsItem-=-rhsItem-return-true-return-falseanyCommonElements(1,-2,-3,-3)?修改anyCommonElements函?,使得?能?返回?序列的交集。在?的情?下,可以省略where,直接?后面的部分就可以了,如?的作用一?的。长沙戴维营教育iOS培训