




已阅读5页,还剩29页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Hacking With Swift 学习笔记目录前言3Introducing to Swift4ARRAYS,DICTIONARIES,LOOPS,SWITCH CASE5OPTIONALS6ENUMERATION7STRUCTS8CLASSES9PROPERTIES10ACCESS CONTROL11POLYMORPHISM AND TYPE CASTING12CLOSURES13本文档使用 看云 构建- 34 -前言原文:http:/frank1ee.github.io/blog/2015/09/13/hacking-with-swift-xue-xi-bi-ji/Hacking with Swift是由Paul Hudson发布的 免费 Swift 教程,其涵盖了30个项目,并且包含了 Swift 2.0。因为该教程是面向初学者,所以很多知识点都没有深入探讨,如果想要深入学习可以参考官方文档:The Swift Programming Language (Swift 2.1)Introducing to SwiftIntroducing to SwiftPlayground 是自 Xcode6 起苹果加入的实时浏览代码结果的一个功能。变量通过 var 声明,常量通过 let 声明。 Swift 可以推断变量的类型(type reference),所以声明变量可以直接如下:varstring=“Mystring”/也可以先声明类型(必须)或声明与赋值同时:varstring:String=“Mystring”苹果官方建议在声明有小数部分的变量时都采用 Double,因其具有更高的精准度。Swift 中 bool 值是 true 和 false。“+” 号也可用于 string :varname1=TimMcGrawvarname2=Romeovarboth=name1+and+name2/TimMcGrawandRomeo字符串的对比运算是”case-sensitive”,也就是区分大小写:varname=“TIMMCGRAWvarname2=TiMmCgRaWname=name2/resultisfalse在 string 中插入变量:varname=“TimMcGraw”“Yournameis(name)”/可以在括号中运算:varage=25“Hisageis(age*2)”ARRAYS,DICTIONARIES,LOOPS,SWITCH CASEARRAYS,DICTIONARIES,LOOPS,SWITCH CASE通过类型注释(Type annotaions)可以申明数组内容的类型:varsongs:String=ShakeitOff,YouBelongwithMe,BacktoDecember,3/以上会报错,因为数组内有非String类型的”3”在内。以下代码仅仅是声明了一个将要被分配包含String对象数组的变量:vararray:String/没有真正创建数组对象vararray:String=/这时才是创建了数组对象vararray=String()/效果同上,语法更为简洁。数组可以直接使用”+”运算符结合:varsongs=ShakeitOff,YouBelongwithMe,LoveStoryvarsongs2=TodaywasaFairytale,WhiteHorse,Fifteenvarboth=songs+songs2both+=“Everything”/可以增加并赋值创建一个 Disctionary:varperson=first:Taylor,middle:Alison,last:Swift,month:December,website:Swift 中,条件表达式不需要括号:ifperson=hateraction=hateelseifperson=playeraction=playelseaction=cruise 在Swift2.0中,println()改为print() Swift 的 for 循环语法:/closedrangeoperatorforiin1.10println(i)x10is(i*10)/*以上结果相当于:println(1x10is(1*10)println(2x10is(2*10)println(3x10is(3*10)println(4x10is(4*10)println(5x10is(5*10)println(6x10is(6*10)println(7x10is(7*10)println(8x10is(8*10)println(9x10is(9*10)println(10x10is(10*10)*/不需要循环数时也可以用下划线代替:for_in1.5str+=fakehalf open range operator(半开区间运算符):“.,例如 .5 将会循环四次,count 将会是 1,2,3,4。”.“ 可以方便于遍历数组(数组的 index 从0算起):foriin0.符号为方法声明返回值:funcalbumsIsTaylor(name:String)-BoolOPTIONALSOPTIONALSApple 在 Swift 中为其加入了 Optional,Optional 是一种类型,可以有值,也可以等于 nil(也就是没有值)。在 oc 中,只有指向对象的指针可以为 nil,而在 swift 中基本类型创建后没有初始值,而是为 nil,并且无法使用。开发中遇到的一些意想不到的问题,例如程序崩溃、影响UI,最常见的原因就是因为使用了为 nil 的值,Optional 这一特性确保了代码安全性。定义一个 Optional 的值只需在类型后添加一个问号“?”:varstr:String?/输出nil/以上是一个名为str的OptionalString.Optional 类型无法直接使用,需要拆包(unwrap)后取出原类型的值后使用。在 Optional 类型后加上感叹号(!)进行显式拆包(Force unwrapping optionals):varstr:String?=HalloWorldstr/nilstr!/HalloWorldprint(str)/输出Optional(HalloWorld)print(str!)/输出HalloWorld通过 if let 语句可以判断 Optional 是否有值,如果有,将其拆包赋值给一个本地变量:funcgetHaterStatus(weather:String)-String?ifweather=sunnyreturnnilelsereturnHate/该方法返回一个OptionalString类型functakeHaterAction(status:String)ifstatus=Hateprint(Hating)/该方法需要传入一个String类型ifletstatus=getHaterStatus(rainy)takeHaterAction(status)/*iflet语句将调用了getHaterStatus方法后得到的Optional值拆包后赋值给本地变量status,确保takeHaterAction方法传入的是一个有值的参数。*/Optional 还提供了隐式拆包(implicitly unwrapped optionals),隐式拆包的 Optional 在使用前无需拆包。要使用隐式拆包需要在变量声明时的数据类型后加上感叹号(!):varstr:String!=HelloWorld!str/HelloWorld!使用隐式拆包需要小心,要确保变量已被正确初始化。一般会在以下情况遇到 Implicitly unwrapped:当使用 Apple 的 API 时会经常碰到隐式拆包的返回值。当使用 UIKit 的用户界面元素时。总结一下 Optional:一个普通类型的变量必须有值,比如一个 String 变量需要拥有一个 string,哪怕是空的字符串(“)。一个 Optional 类型的变量可以有值也可以无值(也就是为nil),但在使用前必须将其拆包(Unwrap)。一个隐式拆包的 Optional 类型变量可以有值也可以无值,使用前不需要拆包,因此 Swift 也不会为你检查,需要格外小心。*Optional Chaining: 在 Objective-C 中,对 nil 发送消息会得到 nil,但是在 Swift 中不允许这么做。当对一个 Optional 类型的对象发送消息时,通过 Optional Chaining 可以对其判断是否有值,如果是则发送消息,反之则什么也不做:funcalbumReleasedYear(year:Int)-String?switchyearcase2006:returnTaylorSwiftcase2008:returnFearlesscase2010:returnSpeakNowcase2012:returnRedcase2014:return1989default:returnnilletalbum=albumReleasedYear(2006)?.uppercaseString/输出Optional(TAYLORSWFIT)/即问号(?)前有值才发送消息,这就是OptionalChainingOptionalChaining如同其名可以像链条一样连接,多长都可以,Swift会从左至右检查直至发现nil即终止:letalbum=albumReleasedYear(2006)?.someOptionalValue?.someOtherOptionalValue?.whateverThe nil coalescing operator: Swift 的这个特性可以让你的代码更加简单和安全。例如:当 Value A 有值时则使用 Value A,如果 Value A 无值,则使用 Value B,这对 Optional 十分有用:letalbum=albumReleasedYear(2006)?unknownprint(Thealbumis(album)/如果albumReleasedYear(2006)返回的Optional无值,则使用非Optionalunknown.ENUMERATIONENUMERATION枚举(Enum)可以将一系列相关的值定义为一个组类型,通过如下语法创建 enum:enumWeatherTypecaseSun,Cloud,Rain,Wind,Snow下面看看如何使用枚举类型:funcgetHaterStatus(weather:WeatherType)-String?ifweather=WeatherType.SunreturnnilelsereturnHategetHaterStatus(WeatherType.Cloud)也可以这么定义枚举:enumWeatherTypecaseSuncaseCloudcaseRaincaseWindcaseSnow也可以这么使用枚举:funcgetHaterStatus(weather:WeatherType)-String?ifweather=.SunreturnnilelsereturnHate/Swift通过Typeinference知道你与WeatherType类型比较,所以无需写明枚举类型,但是这种写法Swift将不会提供代码补足建议辅助getHaterStatus(.Cloud)枚举在 switch/case 中十分有用,因为 Swfit 知道你的枚举类型中都都有什么值,所以能确保你涵盖了所有的 case:funcgetHaterStatus(weather:WeatherType)-String?switchweathercase.Sun:returnnilcase.Cloud,.Wind:returndislikecase.Rain:returnhate/这段代码不会成功编译,应该添加case.Snow或是defaultcase。对于 Enum,Swift 还有一个非常强大的特性:可以为组中的值再附加一个值,进一步细分:enumWeatherTypecaseSuncaseCloudcaseRaincaseWind(speed:Int)caseSnow如此,使用 switch/case 时就有了额外的条件,当条件都满足时 case 才会匹配:funcgetHaterStatus(weather:WeatherType)-String?switchweathercase.Sun:returnnilcase.Wind(letspeed)wherespeedStringreturnThelivealbum(name)soldlots总而言之,一个对象可以同时实现自己类的行为和其父类的行为,这称为多态。Converting types with type casting这种情况时有发生:你有一个明确声明的对象,但你知道它其实是另一种类型(比如上面的继承类StudioAlbum 和 LiveAlbum 被当做 Album 保存在数组中,因为它们继承于 Album 所以是允许的),当需要调用方法时,Swift 可能不知道它的真实类型而无法编译,解决办法是 type casting,即类型转换,可以将一个对象的类型转为另一种类型:foralbuminallAlbumsprint(album.getPerformance()/根据上面代码块的内容 allAlbums 数组拥有三个类型为 Album 的对象,但是其中两个我们知道是 StudioAlbum 和 LiveAlbum ,但是 Swift 却不知道,如果你想执行 print(album.studio) 则无法编译,因为只有 StudioAlbum 拥有那个属性。Type casting 有三种形式,但常见的只有两种: as? 和 as! ,分别是可选向下转型以及强制向下转型,前者会返回一个转型后的可选值(optional value),若转型失败会返回nil;当你确定可以转型成功时使用后者,如果转型失败可能导致应用崩溃:P.S.转型并不是指真的改变实例或它的值,而只是告诉 Swift 把这个对象看做某个类的实例。foralbuminallAlbumsletstudioAlbum=albumas?StudioAlbumstudioAlbum 变量将会拥有一个StudioAlbum?类型数据或是nil,这经常与 iflet 配合使用来自动解包 optional 值:foralbuminallAlbumsprint(album.getPerformance()ifletstudioAlbum=albumas?StudioAlbumprint(studioAlbum.studio)elseifletliveAlbum=albumas?LiveAlbumprint(liveAlbum.location)遍历 allAlums 数组内的对象,并判断它们是否为特定子类,如果是,调用子类的方法/属性。强制向下转型(forced downcasting)就相当于转型并强制拆包,返回的是一个非 optional 值,可以直接使用:vartaylorSwift=StudioAlbum(name:TaylorSwift,studio:TheCastlesStudios)varfearless=StudioAlbum(name:SpeakNow,studio:AimeelandStudio)varallAlbums:Album=taylorSwift,fearlessforalbuminallAlbumsletstudioAlbum=albumas!StudioAlbumprint(studioAlbum.studio)/便利数组时如果数组内有liveAlbum类的实例就会crash,因为使用了强制转型/所以为了不crash,只存放StudioAlbum实例在数组中Swfit 也允许将转型写在数组遍历层,在数组便利初始就将数据转型,如此更有效率:foralbuminallAlbumsas!StudioAlbumprint(album.studio)/相当于省去了letstudioAlbum=albumas!StudioAlbum但这么用必须得确保数组中所有实例都是 StudioAlbum 类型,否则会crash。可选向下转型(optional downcasting)也可以这么用,但因为这样做有可能提供给遍历一个nil,所以需要用 ?(nil coalescing operator) 来确保提供给 loop 一个值:foralbuminallAlbumsas?LiveAlbum?LiveAlbum())print(album.location)这样相当于:尝试将对象从 allAlbums 转为 LiveAlbum 类型,如果失败,就创建一个空的 LiveAlbum 对象来替代,这相当于啥也没做。这有可能会用得上,不过最
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 火花线切割机床项目投资可行性研究分析报告(2024-2030版)
- 中国医用纯化水设备行业发展监测及发展战略规划报告
- 中国汽车平衡块行业市场全景评估及发展战略规划报告
- 中国电容器用薄膜市场调查报告
- 2025年中国气瓶光面环规行业市场发展前景及发展趋势与投资战略研究报告
- 2025-2030年中国全钢中央台项目投资可行性研究分析报告
- 中国川乌头行业市场深度评估及投资战略规划报告
- 中国回光灯市场发展前景预测及投资战略咨询报告
- 早教班老师培训课件
- 同城配送合同
- 剧毒易制爆化学品防盗、防抢、防破坏及技术防范系统发生故障等状态下的应急处置预案
- 壮族文化宣传介饮食服饰建筑风俗习惯特点传统节日课件
- 牛津译林版英语八年级下册期末复习各单元话题写作范文背诵
- 降低患者便秘品管圈课件
- 2024CSCO胃肠间质瘤诊疗指南解读
- 《国有企业管理人员处分条例》重点解读
- CJT163-2015 导流型容积式水加热器和半容积式水加热器
- DL-T5159-2012电力工程物探技术规程
- 2025届新疆维吾尔自治区新疆生产建设兵团二中物理高一第二学期期末质量检测试题含解析
- 湖南省株洲荷塘区四校联考2024届八下物理期末综合测试试题及答案解析
- FZ∕T 61002-2019 化纤仿毛毛毯
评论
0/150
提交评论