苹果Swift编程语言入门教程中文版苹果Swift编程语言入门教程,苹果开发语言Swift以其新面目闪亮登场,北京iOS培训,蓝鸥科技和您一起解析苹果新语言:欢迎来到SwiftSwift是一门集C语言、Objective-C语言优势于一身的全新编程语言,是由苹果开发的专门针对iOS以及OSX平台的程序设计语言,并且完全兼容C语言。Swift采用更安全的编程模式,并且添加了一些流行的特性,这让编程变得更加简单,更加灵活,更有乐趣。Swift以其全新的面貌展示给众人,借助于成熟的、非常受欢迎的Cocoa以及CocoaTouch框架为重新定义软件开发方式创造了有利条件。Swift已经酝酿多年,苹果通过改进现有的编译器、调试器、以及基础框架为Swift建立了坚实的基础。我们通过自动引用计数技术(ARC)进一步简化了内存管理的方式。建立在Foundation框架以及Cocoa框架等坚实的基础上的框架,Swift已经具备现代化和标准化的特征。Objective-C已经演化到支持块语句(block)、集合字面量、模块以及通过使用框架来与现代化语言技术实现无缝对接。感谢这些基础工作,我们现在可以正式介绍苹果未来软件开发的全新语言-Swift。Swift对于使用Objective-C作为开发语言的开发人员来说可谓似曾相识,十分亲切。因为它采用Objective-C见名知意的参数命名规则以及强大的Objective-C动态对象模型。它可以与现有的Cocoa框架无缝对接,并且可以与Objective-C实现代码混编。建立在这些共同点上,Swift还引入了许多新特性、代码混编并且是完全面向对象的语言。Swift对于开发者来说是友好的。它是第一款像脚本语言一样灵活、有趣的企业级系统编程语言。它支持playgrounds模式,一个无需通过编译和运行程序就能允许开发者一边写Swift代码一边立即查看代码的执行结果的创造性尝试。Swift结合了现代开发语言的各种优势,这源自于苹果的优良的开发文化。其编译器为性能而生,而其语言为开发而生,缺一不可。这一切使得Swift成为开发者乃至苹果最有价值的投资。编写iOS和OSX应用,Swift是一个非常棒的方式,未来会持续引入新特性和新功能。对于Swift,我们拥有雄心壮志,真是迫不及待的想要看到您如何用它来创造奇迹。Swift概览依照传统,第一次使用新的语言做开发,应当在屏幕上打印出来“Hello,world”。用Swift,只需要简单的写下如下语句:println(Hello,world)如果你已经写过C语言或者Objective-C代码,Swift这种语法规则你一定会觉得很面熟,并且这已经是一个完整的程序了。你无需引入单独的类库来完成输入/输入或者字符串操作功能。代码书写在一个程序的全局入口,所以你不再需要main函数。最最重要的是你也不必在每行语句结束时写上恼人的分号。本章节将提供足够的信息帮助你如何使用Swift语言完成多种不同的编程工作。还不理解?不必担心,概览中提到的知识点将在本书随后的内容中会详细讲解。注:为了得到更好的体验,请在XCode中创建playground项目,Playgrounds可以编写Swift代码,同时立即查看代码的执行结果。简单值使用let关键字声明常量,使用var关键字声明变量。虽然编译时不必知道常量的值,但是至少得为声明的常量赋值一次。这意味着声明一个常量,可以多次使用该常量对应的值。varmyVariable=42myVariable=50letmyConstant=42常量或者变量应当与你所赋的值类型相同。通常,不用书写确切的类型。只需要为一个常量或者变量赋值,让编译器去推断它们的类型吧。在上述的例子中,编译器会推断出myVariable变量是一个整型integer因为其初值就是整型的。如果初值没有足够的信息用于推断其类型(或者根本没有初值)可以通过在常量或者变量名后添加冒号和类型名来指定其类型。letimplicitInteger=70letimplicitDouble=70.0letexplicitDouble:Double=70实验:声明一个常量赋初值为4,并且指明其类型为Float型在Swift中不能隐式转换一个值的类型,如果需要将某个值转换成不同类型,需要创建代转类型的实例。letlabel=Thewidthisletwidth=94letwidthLabel=label+String(width)实验:尝试移除最后一行字符串转换函数,看到了什么错误?其实有更简单的方式将一些基本数据包含到字符串中,那就是将数据写在小括号中,然后在小括号前加一个反斜杠就可以了。例如:letapples=3letoranges=5letappleSummary=Ihave\(apples)apples.letfruitSummary=Ihave\(apples+oranges)piecesoffruit.实验:使用\()将一个浮点型数值加入到一个包含某人姓名的字符串中用中括号([])来声明数组和字典,然后通过在[]中写上数组的下标或者字典中的键来访问数据元素。varshoppingList=[catfish,water,tulips,bluepaint]shoppingList[1]=bottleofwatervaroccupations=[Malcolm:Captain,Kaylee:Mechanic,]occupations[Jayne]=PublicRelations如果要创建空的数组或者字典,可以使用初始化语法。letemptyArray=String[]()letemptyDictionary=DictionaryString,Float()如果类型可以被编译器推断出来,那么你可以直接用[]创建空数组,[:]来创建字典—例如,当你为一个变量赋一个新值,或者为一个函数传参数是,你可以这样做:shoppingList=[]//Wentshoppingandboughteverything.控制流程:使用if和switch做条件判断,使用for-in,for,while和do-while来执行循环。值得注意的是,判断条件或者循环变量旁的小括号不是必写的。但是大括号依然要写。letindividualScores=[75,43,103,87,12]varteamScore=0forscoreinindividualScores{ifscore50{teamScore+=3}else{teamScore+=1}}teamScore在if语句中,判断条件必须是布尔表达式(Boolean)—这样的话,ifscore{…}这句就是有错误的,因为score并不是隐式的跟0做比较。在当某些值可能为空的时候,你可以同时使用if和let,这样这些值就表示为可选的。一个可选的值既可以包含某个确定的值也可以为nil,nil表示一个空值。当然在类型后加一个问号(?)就可以将该值标记为可选的。varoptionalString:String?=HellooptionalString==nilvaroptionalName:String?=JohnAppleseedvargreeting=Hello!ifletname=optionalName{greeting=Hello,\(name)}实验:将optionalName赋值为nil,greeting的结果会是什么呢?当optionalName为nil是添加一个else语句来设置一个不同的greeting如果可选值为nil,那么if语句的判断条件就是false,大括号中的代码也会被跳过。否则,可选值就会执行相关的代码块并把结果赋值给let后面对应的常量,这样大括号所表示的代码块的值就会可用。不同于C语言或者Objective-C,switch语句在Swift语言中支持任意数据类型和各种各样的比较操作—并局限于整型和等式比较。letvegetable=redpepperswitchvegetable{casecelery:letvegetableComment=Addsomeraisinsandmakeantsonalog.casecucumber,watercress:letvegetableComment=Thatwouldmakeagoodteasandwich.caseletxwherex.hasSuffix(pepper):letvegetableComment=Isitaspicy\(x)?default:letvegetableComment=Everythingtastesgoodinsoup.}实验:尝试移除defaultcase,你看到了什么错误?当符合条件的case被执行后,程序将会跳出switch语句。程序并不会顺序执行接下来的case,所以在switch语句中就没有必要显式的通过在每个case对应的代码片段结尾使用关键字break来跳出该语句。同时,你可以通过两个变量来表示字典的每一个键值对再配合使用for-in来快速遍历字典。letinterestingNumbers=[Prime:[2,3,5,7,11,13],Fibonacci:[1,1,2,3,5,8],Square:[1,4,9,16,25],]varlargest=0for(kind,numbers)ininterestingNumbers{fornumberinnumbers{ifnumberlargest{largest=number}largest实验:通过添加一个新的变量来记录遍历得到的数中的最大数while语句依然继承自C语言,除非条件发生改变,否则会循环执行某段代码。同时循环的条件也可以写在最后面,这样可以确保循环至少会被执行一次—do-while。varn=2whilen100{n=n*2}nvarm=2do{m=m*2whilem100m在for循环中,你可以使用..来描述循环变量的取值范围,或者依然使用C语言中声明变量,条件和自增运算的方式,这两者是等价的。varfirstForLoop=0foriin0..3{firstForLoop+=i}firstForLoopvarsecondForLoop=0forvari=0;i3;++i{secondForLoop+=1}secondForLoop如果是使用..的话,取值范围不包括上限(类似于i5),若要包括则需要使用…(i=5)函数与闭包函数的声明需要使用关键字func。可以通过函数名和对应的参数列表来调用函数。通过使用-为函数指定返回值类型,便于区分参数名和参数类型。funcgreet(name:String,day:String)-String{returnHello\(name),todayis\(day).}greet(Bob,Tuesday)实验:删除参数day,为greet函数添加一个新的参数来表示中午吃什么饭使用元组来为函数制定多个返回值funcgetGasPrices()-(Double,Double,Double){return(3.59,3.69,3.79)}getGasPrices()函数的参数数量也可以是可变的,可以用一个数组来表示。funcsumOf(numbers:Int...)-Int{varsum=0fornumberinnumbers{sum+=number}returnsum}sumOf()sumOf(42,597,12)实验:定义一个可以计算所有参数平均值的函数值得注意的是,Swift语言总函数是可以嵌套的,被嵌套的函数可以访问外层函数中定义的变量。对于太长或者太复杂的函数,你可以以函数嵌套的方式来重构该函数。funcreturnFifteen()-Int{vary=10funcadd(){y+=5}add()returny}returnFifteen()Swift中函数有一些特别的优点:一个函数可以作为另外一个函数的返回