Swift 快速入门

Swift是Apple公司今年WWDC发布的新语言。为了这门新语言,Apple发布了Swift参考指南(Swift reference guide)这本书,我强烈推荐这本书。

不过这本书有点长,如果你没多少时间但是又想快速的学习Swift,那这个教程就适合你。

这个教程大约15分钟,快速的过一遍Swift语言,咱们要过的内容有:变量,控制流,类,最佳实践等等..

为了学习这个Swift教程,你需要下载最新版本的XCode6,你不需要有Swift或者Objective-C语言的经验,不过有经验的话那对理解会有帮助。


重要信息:确保你的XCode是最新版的(去iOS 开发者中心可以确认 ),Swift在快速的改变,我们会尽量根据最新的XCode beta做出教程的更新,代码可能在老的版本上运行不了。

(译者注:现在XCode已经发布正式版了,所以不用担心版本问题)


Playgrounds介绍

启动Xcode6,打开 File\New\File,选择iOS\Source\Playground,点击 Next。

命名文件名为:SwiftTutorial.playground,点击Next,保存文件在一个你自己比较方便的地方。删除文件里的其他信息,保证文件里是清空的状态。


playground 这个新的文件类型,允许你测试Swift代码,可以在边栏看到每行代码运行的结果。举个例子,添加下面代码到playground:

[objc] view plain copy
  1. lettutorialTeam=56
  2. leteditorialTeam=23
  3. lettotalTeam=tutorialTeam+editorialTeam

当你选择这些代码行时,你在右边栏能看到每行的结果,很方便,是不是。

Playgrounds 是学习Swift相关的一个非常好的方法,比如体验新的APIs,协议代码或者算法,还可以可视化画图代码。在接下来的教程里,你讲在这个playground上工作。


提示:在这里,我非常推荐你把这个playground文件拖放到OS X系统的Dock快捷方式里。当你像测试一些Swift 代码时,这样你可以像便签一样快速的使用这个文件。


在Swift中的Variables(变量) vs. Constants (常量)

当尝试在playground中添加下面的代码:

    totalTeam+=1
你将看到这一行有错误,这是因为totalTeam是个常量,它是不可以被改变的。声明常量用let关键字。如果你想让totalTeam变成一个变量,一个可以改变的值,那就用另外一个关键字声明它:var。

用下面这行代码替换刚才初始化totalTeam的代码:

    vartotalTeam=tutorialTeam+editorialTeam
这样没问题了。不过你会想,"为什么不用var声明所有的变量呢,因为它少限制吗?"

不过,用let声明是最佳的实践,因为它允许编译器进行性能优化。记住:优先用let

显式 vs 推断(隐式类型)

到目前为止,你没有给这些常量或变量显式设置任何类型,因为编译器可以根据代码获取到足够的信息自动推断类型。比如,因为设置了tutorialTeam为56,编译器就知道56是个整型,而且自动把tutorialTeam设置为Int型。

如果你想显式的设置类型也可以,替换哪行代码设置tutorialTeam成下面这样:

    lettutorialTeam:Int=56
现在你会想,使用显式类型呢,还是用编译器的隐式类型呢。我们相信在实际中使用编译器制动识别的隐式类型比较好。因为这样你可以得到一个非常大的好处:简明和易读的代码。

那么,我们把代码换回隐式类型:

    lettutorialTeam=56

Swift的基本类型和流程控制

到目前为止,数据类型你看见了Int这个整型值的例子,不过Switf中还有很多数据类型。

Floats and Doubles

    letpriceInferred=19.99
  1. letpriceExplicit:Double=19.99
有小数点的类型有两种,就是:Float and Double 。Double有更高的精度,并且是小数点默认类型。这就意味着priceInferred也是个Double型。

Bools

    letonSaleInferred=true
  1. onSaleExplicit:Bool=false

注意在Swift中用ture/false作为布尔值(不像objective-c的用的是 YES/NO)。

Strings

    letnameInferred="WhoopieCushion"
  1. nameExplicit:String="WhoopieCushion"
String跟你预想的一样,不再像objective-c那样用@作为开头了。这肯能需要有一段时间才能让你的肌肉记忆适应这种写法。

if语句 、string插入

    ifonSaleInferred{
  1. println("\(nameInferred)onsalefor\(priceInferred)!")
  2. }else{
  3. println("\(nameInferred)atregularprice:\(priceInferred)!")
  4. }
这是一个if语句的例子,就像你预想的语言不一样。括住条件的小括号是可选的,但是花括号就算有只有一行代码也是必须的!!

上面代码也展示了一个新的技术:字符串插入。不管你在什么时候想在字符串中插入其他字符串,只需要简单的使用这样的语法:\(你的语句).

在这,你会有疑问,代码的打印信息去哪了?为了能看见打印的信息,请按顺序点开View\Assistant Editor\Show Assistant Editor.

这是教程上面例子的playground文件

类和方法

在Swift开发中,其中一个最常用的就是创建类和方法,那我们回到正路上。首先,删除你的playground文件里的所有代码,这样你可以从零开始。其次,你将创建一个消费计算器,这个计算器能帮你算清楚你在餐馆用餐后的小费。下面每次一小块一小块的添加代码,同时解释每一步这些代码。

//1

    classTipCalculator{
  1. }
创建一个类,只需要简单的输入class这个关键字和类名,再输入一对大括号作为body就可以。如果你是子类化另外一个类,你只需要在需要子类化的类前面用输入:和你的类名。注意如果你没有什么需要继承的,你不需要子类化任何东西(不像 objctive-c,你必须子类化NSObject或者一些NSObject的子类)


添加下面的代码到大括号里

//2

    total:Double
  1. taxPct:Double
  2. letsubtotal:Double
这就是创建类属性的方法,创建变量或者常量都是如此。这里你是创建了常量属性。一个是账单总额(税后) ,一个这个账单的税率,一个是账单的子总额(税后)。

注意,任何一个你声明的属性都需要初始化,或者在初始化方法里初始化。否则你需要把这么声明为可选的(教程的后面会提到)

注意:根据Emily Post Etipedia,小费必须是税前的。所以这个类在计算小费时加上了税前总额!


把下面的代码添加到前面的代码块后面(要在大括号里):

//3

    init(total:Double,taxPct:Double){
  1. self.total=total
  2. self.taxPct=taxPct
  3. subtotal=total/(taxPct+1)
  4. }


这里为这个类创建了带有两个参数的初始化方法,初始化方法在Swift中总是以init来命名,你可以有一个或者多个初始化方法。但是你需要通过给方法带上不同的参数来区分。

注意,初始化方法的参数名称和类的属性名称一样,所以需要在类属性名称前面加上self来区分两个变量。

注意,因为没有名称和subtotal属性冲突,所以你不需要添加self关键字,因为编译器会自动完成。是不是很酷!

Add this code after the previous block (inside the curly braces):
// 4
func calcTipWithTipPct(tipPct:Double) -> Double {
return subtotal * tipPct
}

添加以下代码在前面的代码块后面(要在大括号里)

    funccalcTipWithTipPct(tipPct:Double)->Double{
  1. returnsubtotal*tipPct
  2. }

声明一个方法,需要用func关键字。列出方法的参数(需要显式的类型),在后面添加->符号作为返回的类型。这个方法确定了小费的总额。总额就是简单用subtotal乘以小费百分比。

添加以下代码在前面的代码块后面(要在大括号里)

// 5

    funcprintPossibleTips(){
  1. println("15%:\(calcTipWithTipPct(0.15))")
  2. println("18%:\(calcTipWithTipPct(0.18))")
  3. println("20%:\(calcTipWithTipPct(0.20))")
  4. }

这是一个打印三个可能的小费的方法。

注意,当调用一个类实例方法时,第一个参数不用命名(不过后面的必须命名)

同时也注意到,string的插入使用方法不光是用在变量,你可以用在复杂的方法调用和操作。


添加下面的代码在playground文件在最下面(在大括号外)

// 6

    lettipCalc=TipCalculator(total:33.25,0); background-color:inherit">taxPct:0.06)
  1. tipCalc.printPossibleTips()


最后,创建一个小费计算器的实例和调用方法打印几种可能的小费,

下面是这时候你的playground文件的样子:

    //1
  1. classTipCalculator{
  2. //2
  3. subtotal:Double
  4. //3
  5. init(total:Double,taxPct:Double){
  6. self.total=total
  7. self.taxPct=taxPct
  8. subtotal=total/(taxPct+1)
  9. }
  10. //4
  11. funccalcTipWithTipPct(tipPct:Double)->Double{
  12. }
  13. //5
  14. funcprintPossibleTips(){
  15. println("15%:\(calcTipWithTipPct(0.15))")
  16. println("18%:\(calcTipWithTipPct(0.18))")
  17. println("20%:\(calcTipWithTipPct(0.20))")
  18. //6
  19. lettipCalc=TipCalculator(total:33.25,248)"> tipCalc.printPossibleTips()

通过Assistant Editor检查代码的结果。


Arrays 和 For循环

上面的代码有点重复,因为你调用了多次calcTipWithTotal方法传入了不同的小费百分比。你可以用array来减少代码的重复。

用下面代码替换printPossibleTips方法里的代码。

    letpossibleTipsInferred=[0.15,0.18,0.20]
  1. possibleTipsExplicit:[Double]=[0.15,0.20]
这里展示了隐式和显式创建double类型数组的例子,注意[Double]是Array<Double>的缩写。枚举数组所有项跟Objective-C中的快速枚举类似。注意,这里不需要小括号。

你可以这样写循环:

    foriin0..<possibleTipsInferred.count{
  1. letpossibleTip=possibleTipsInferred[i]
  2. println("\(possibleTip*100)%:\(calcTipWithTipPct(possibleTip))")
  3. }

..<操作符是不包含在范围和不包含上限值操作符。当然也有...操作符是包含的。

Arrays有count属性,它是数组里项目的数量。你可以通过ArrayName[index]语法访问指定的项。


字典(Dictionaries)

让我们给小费计算器做最后的改动。除了可以简单打印小费,你可以返回一个字典结果。这回使得结果更简单的展示在app的用户界面上。删除printPossibleTips方法,替换成下面代码:

    funcreturnPossibleTips()->[Int:Double]{
  1. letpossibleTipsInferred=[0.15,0.20]
  2. //2
  3. varretval=Dictionary<Int,Double>()
  4. forpossibleTipinpossibleTipsInferred{
  5. letintPct=Int(possibleTip*100)
  6. retval[intPct]=calcTipWithTipPct(possibleTip)
  7. returnretval
  8. }
让我们一步一步的来看。

1.这里你设置返回值为dictionary,key是int型(小费比率是一个int,比如15,20)value是一个Double(计算后的小费).注意[Int: Double] 只是Dictionary<Int,Double>的简写.

2.这就是创建创建一个空字典的方法。因为你需要修改字典,所以要把用var来声明变量,而不是用let。否则会编译错误。

3.这里告诉你如何设置一个字典的值。就像你看到的,跟传统的Objective-C类似。

最后,在playground修改代码调用这个方法:

tipCalc.returnPossibleTips()

一旦把代码放到playground里,你就能在inspector看到结果了(点那个眼睛展开视图)

恭喜你,你有了一个Swift版的全功能的小费计算器。


原文地址:http://www.raywenderlich.com/74438/swift-tutorial-a-quick-start

本人水平有限,翻译有错误请不吝支出错误,谢谢。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘贴.待开发的功能:1.支持自动生成约束2.开发设置页面3.做一个浏览器插件,支持不需要下载整个工程,可即时操作当前蓝湖浏览页面4.支持Flutter语言模板生成5.支持更多平台,如Sketch等6.支持用户自定义语言模板
现实生活中,我们听到的声音都是时间连续的,我们称为这种信号叫模拟信号。模拟信号需要进行数字化以后才能在计算机中使用。目前我们在计算机上进行音频播放都需要依赖于音频文件。那么音频文件如何生成的呢?音频文件的生成过程是将声音信息采样、量化和编码产生的数字信号的过程,我们人耳所能听到的声音频率范围为(20Hz~20KHz),因此音频文件格式的最大带宽是20KHZ。根据奈奎斯特的理论,音频文件的采样率一般在40~50KHZ之间。奈奎斯特采样定律,又称香农采样定律。...............
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿遍又亿遍,久久不能离开!看着小仙紫姐姐的蹦迪视频,除了一键三连还能做什么?突发奇想,能不能把舞蹈视频转成代码舞呢?说干就干,今天就手把手教大家如何把跳舞视频转成代码舞,跟着仙女姐姐一起蹦起来~视频来源:【紫颜】见过仙女蹦迪吗 【千盏】一、核心功能设计总体来说,我们需要分为以下几步完成:从B站上把小姐姐的视频下载下来对视频进行截取GIF,把截取的GIF通过ASCII Animator进行ASCII字符转换把转换的字符gif根据每
【Android App】实战项目之仿抖音的短视频分享App(附源码和演示视频 超详细必看)
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至2022年4月底。我已经将这篇博客的内容写为论文,上传至arxiv:https://arxiv.org/pdf/2204.10160.pdf欢迎大家指出我论文中的问题,特别是语法与用词问题在github上,我也上传了完整的项目:https://github.com/Whiffe/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset关于自定义ava数据集,也是后台
因为我既对接过session、cookie,也对接过JWT,今年因为工作需要也对接了gtoken的2个版本,对这方面的理解还算深入。尤其是看到官方文档评论区又小伙伴表示看不懂,所以做了这期视频内容出来:视频在这里:本期内容对应B站的开源视频因为涉及的知识点比较多,视频内容比较长。如果你觉得看视频浪费时间,可以直接阅读源码:goframe v2版本集成gtokengoframe v1版本集成gtokengoframe v2版本集成jwtgoframe v2版本session登录官方调用示例文档jwt和sess
【Android App】实战项目之仿微信的私信和群聊App(附源码和演示视频 超详细必看)
用Android Studio的VideoView组件实现简单的本地视频播放器。本文将讲解如何使用Android视频播放器VideoView组件来播放本地视频和网络视频,实现起来还是比较简单的。VideoView组件的作用与ImageView类似,只是ImageView用于显示图片,VideoView用于播放视频。...
采用MATLAB对正弦信号,语音信号进行生成、采样和内插恢复,利用MATLAB工具箱对混杂噪声的音频信号进行滤波
随着移动互联网、云端存储等技术的快速发展,包含丰富信息的音频数据呈现几何级速率增长。这些海量数据在为人工分析带来困难的同时,也为音频认知、创新学习研究提供了数据基础。在本节中,我们通过构建生成模型来生成音频序列文件,从而进一步加深对序列数据处理问题的了解。
基于yolov5+deepsort+slowfast算法的视频实时行为检测。1. yolov5实现目标检测,确定目标坐标 2. deepsort实现目标跟踪,持续标注目标坐标 3. slowfast实现动作识别,并给出置信率 4. 用框持续框住目标,并将动作类别以及置信度显示在框上
数字电子钟设计本文主要完成数字电子钟的以下功能1、计时功能(24小时)2、秒表功能(一个按键实现开始暂停,另一个按键实现清零功能)3、闹钟功能(设置闹钟以及到时响10秒)4、校时功能5、其他功能(清零、加速、星期、八位数码管显示等)前排提示:前面几篇文章介绍过的内容就不详细介绍了,可以看我专栏的前几篇文章。PS.工程文件放在最后面总体设计本次设计主要是在前一篇文章 数字电子钟基本功能的实现 的基础上改编而成的,主要结构不变,分频器将50MHz分为较低的频率备用;dig_select
1.进入官网下载OBS stdioOpen Broadcaster Software | OBS (obsproject.com)2.下载一个插件,拓展OBS的虚拟摄像头功能链接:OBS 虚拟摄像头插件.zip_免费高速下载|百度网盘-分享无限制 (baidu.com)提取码:6656--来自百度网盘超级会员V1的分享**注意**该插件必须下载但OBS的根目录(应该是自动匹配了的)3.打开OBS,选中虚拟摄像头选择启用在底部添加一段视频录制选择下面,进行录制.
Meta公司在9月29日首次推出一款人工智能系统模型:Make-A-Video,可以从给定的文字提示生成短视频。基于**文本到图像生成技术的最新进展**,该技术旨在实现文本到视频的生成,可以仅用几个单词或几行文本生成异想天开、独一无二的视频,将无限的想象力带入生活
音频信号叠加噪声及滤波一、前言二、信号分析及加噪三、滤波去噪四、总结一、前言之前一直对硬件上的内容比较关注,但是可能是因为硬件方面的东西可能真的是比较杂,而且需要渗透的东西太多了,所以学习进展比较缓慢。因为也很少有单纯的硬件学习研究,总是会伴随着各种理论需要硬件做支撑,所以还是想要慢慢接触理论学习。但是之前总找不到切入点,不知道从哪里开始,就一直拖着。最近稍微接触了一点信号处理,就用这个当作切入点,开始接触理论学习。二、信号分析及加噪信号处理选用了matlab做工具,选了一个最简单的语音信号处理方
腾讯云 TRTC 实时音视频服务体验,从认识 TRTC 到 TRTC 的开发实践,Demo 演示& IM 服务搭建。
音乐音频分类技术能够基于音乐内容为音乐添加类别标签,在音乐资源的高效组织、检索和推荐等相关方面的研究和应用具有重要意义。传统的音乐分类方法大量使用了人工设计的声学特征,特征的设计需要音乐领域的知识,不同分类任务的特征往往并不通用。深度学习的出现给更好地解决音乐分类问题提供了新的思路,本文对基于深度学习的音乐音频分类方法进行了研究。首先将音乐的音频信号转换成声谱作为统一表示,避免了手工选取特征存在的问题,然后基于一维卷积构建了一种音乐分类模型。
C++知识精讲16 | 井字棋游戏(配资源+视频)【赋源码,双人对战】
本文主要讲解如何在Java中,使用FFmpeg进行视频的帧读取,并最终合并成Gif动态图。
在本篇博文中,我们谈及了 Swift 中 some、any 关键字以及主关联类型(primary associated types)的前世今生,并由浅及深用简明的示例向大家讲解了它们之间的奥秘玄机。