为了账号安全,请及时绑定邮箱和手机立即绑定

【译】学习使用Swift编写iOS app教程1:欢迎来到编程世界

标签:
iOS

写在前面:
刚刚开始学习Swift开发,很幸运的是在网上闲逛的时候看到了Ray Wenderlich的这些关于iOS开发的教程,写的非常详尽,还很有趣,不时会搭配一些很贱的小表情,非常对我的胃口:-)在此对其进行一些翻译,纰漏之处,欢迎大家指正。
——Schuming


Update note: This tutorial was updated for iOS 9 and Swift 2 by Brian Moakley. Original post by Mike Jaoudi and Ry Bristow.
你是否想过,为你的iPhone或iPad制作一款属于自己的app会是一件多棒的事情?
现在开始学习就是最好的时机!
这个教程系列是为iOS开发初学者准备的,它将带着你从基本概念入手,进阶至创作一款带有漂亮用户界面的完整的iOS app.
iOS app开发这条路,可以让你无止境的走下去.这个Swift教程会提供你所需要的内容,通过这些内容你可以创建那些你梦寐以求的了不起的apps.

注: 如果你是一个纯粹的编程初学者, 那么这个教程就是为你准备的! 如果你已经是一个有经验的开发者并且想来点快节奏的东西, 那么请看这个教程系列.


开始
第一步就是下载Xcode – 你用来编写app程序的软件. 你可以在Mac App Store中免费的下载:
图片描述
请确保你下载的Xcode是最新版本 – 学习Swift需要Xcode 6或者更新的版本.
安装好Xcode之后,打开Xcode并点击写有" Get started with a playground"的按键.
图片描述

注:如果你没有看到“Welcome to Xcode” 的窗口, 点击Window\Welcome to Xcode用来显示它.
playground 是一种用来体验和使用Swift编程的简单易用的方式.
你不能将playground 作为一款iPhone app来运行,但是它对于帮助你理解Swift的基本原理起着至关重要的作用. 不要担心, 你很快就可以创建自己的iPhone app!
将name 设置为MyPlayground, platform设置为iOS, 然后点击 Next. 将playground保存到你所希望的路径下.
图片描述


介绍Playgrounds
你将会看到你创建的playground已经带有下面三行代码:

// Playground - noun: a place where people can play

import UIKit

var str = "Hello, playground"

下面我们来逐行分析playground

// Playground - noun: a place where people can play

第一行这种以两个正斜杠作为开始的方式叫做注释.
这行代码仅仅是给你或者其他开发者用来观看的.它并不会对你的代码功能造成任何影响.把它当作是一种"在代码中写便签"的方法.

import UIKit

第二行引入了 UIKit,你可以把UIKit当作是一些Apple公司里很厉害的家伙们写的代码集.现在你需要了解的仅仅是: 你需要这行代码来使你接下来的代码正常工作.

var str = "Hello, playground"

第三行代码是你现在需要关注的.
这行代码创建了一个变量叫做str,str中保存了"Hello, playground"这个值.在窗口的右边,你可以看到Xcode在跟踪变量中所保存的值.
图片描述
试着将 "Hello, playground" 改为 "Look what I can do!", 就像这样:

var str = "Look what I can do!"

你看到右边窗口也改变了它的显示内容了吗?恭喜你!你已经开始做一些编程了!
图片描述


你自己的Calculator
现在让我们看看还可以做些什么.在文件的底部,试着输入一个基本的数学表达式,比如:2+2,敲一下回车换行

2+2

playground将会在窗口右面的隐藏部分给出等式的答案.
图片描述
是不是很酷? 你也可以尝试其他数学运算.
挑战: 快 –使用Playgrounds告诉我123 * 456的结果!
答案:
在你的playground中输入:

123*456

在右边,你会看到下面的答案:

56,088

你是个数学天才!
playground用作一个简单的计算器是很棒的,但是现在,让我们继续下去,来做一些更多编写代码的学习.
删除程序中除了import UIKit以外的所有内容.以便你有一块干净的输入区.

import UIKit

将这一行代码保留非常重要,因为没有它的情况下,playground将无法工作.


变量(Variables)
接下来,是时候来看看变量这个东西了.
你通过变量(variables) 来存储值(values). 当你创建一个变量时, 你总是会使用下面的语法:

var yourVariableName: yourType = yourInitialValue

Except you substitute the following:
yourVariableName: 任何你想要为变量所取的名字, 比如strage.
yourType: 变量类型,比如StringInt. 对于类型,过后会有更多的讲解.
yourInitialValue: 任何你想为变量设置的初始值,比如“Look what I can do!” 或18.


类型(Types)
这里是一些Swift一定会提供的基础数据类型:

  • Int – 整数(whole numbers)或者整型数(integers)
  • Double – 十进制数(decimal numbers)
  • Bool – 一个可以为true或者false的值(a value that can be true, or false)
  • String – 一个包含字符或单词的“字符串”(a “string” of letters or words)
    练习使用这些数据类型.把下面的代码添加到playground的底部.
var luckyNumber: Int = 7
var costOfCandy: Double = 1.25
var hungry: Bool = true
var name: String = "Ryland"

由于playground一直在跟踪每个变量值,注意显示在右边窗口隐藏区域的值的变化.现在,试着改变String型变量name的值.
在playground底部添加如下代码:

name = "Ry"

这行代码不需要使用var或者:String,因为对象已经创建.你所需要做的仅仅是改变他所存储的值.
挑战: 轮到你来尝试一下了. 在文件的底部,尝试创建一个变量来代表你最喜欢的游戏.
答案:

var favoriteGame: String = "Mario Kart"
favoriteGame = "Super Smash Bros."

常量(Constants)
有一些叫做常量的特殊变量.
通过关键词let对他们进行声明,而不是var.这样做会使它成为不可更改的值.
任何可能的时候,你都应该尽可能使用let而不是var,因为这会让你的代码运行的更快.原因是编译器不需要再强制的去检测变量值发生更改的可能性.任何数据类型都可以被用作常量来使用,就像任何数据类型都可以被用作变量来使用.
现在试着创建一些.把这些代码添加到你的playground文件底部:

let life: Int = 42
let pi: Double = 3.14
let canTouchThis: Bool = false
let captain: String = "Kirk"

现在试着给captain赋一个新值,比如"Hook".在你的playground底部输入这行代码:

captain = "Hook"

你会注意到,在左边出现了一个小的红色符号,伴随有一个感叹号.这是在告诉你你的代码中出现了错误.
图片描述
点击这个符号,就会看见弹出了" Cannot assign to ‘let’ value ‘captain’ "的错误信息.这是在告诉你由于你使用let初始化了变量,因此将他变成了常量,它的值不能被改变.
图片描述
移除captain = "Hook"这行代码来去除错误.
挑战:创建一个叫favoriteNumber的Int型变量, 给他赋值为你最喜欢的数字.
答案:

let favoriteNumber: Int = 3

类型推断(Inferred Typing)
对类型感到厌烦了吗t? 不要害怕, Swift比你想的要聪明.
Swift中有一个新的特性叫做类型推断(Inferred Typing). 这意味着当你声明并初始化变量时,如果你提供了足够的信息,Swift可以预测出数据类型,因此你不需要每次都在声明中包含数据类型.
这不仅仅让你从类型声明这个环节中节省了时间和精力,它还让你的程序更加整洁并且易于维护.
试一试, 找到这行代码var luckyNumber: Int = 7 并将它替换成下面的内容:

var luckyNumber = 7

图片描述
这看起来可能没什么大不了的,但是从长远来看,这会省去你很多的类型输入操作.
记住,类型推断只能在你提供了正确的信息时才会起作用.如果你希望luckyNumber是一个Double类型, 你讲必须将它置为7.0 (解释一下7.0是一个十进制数(decimal number), 而7是一个整型数(integer)).
挑战: 回过头尝试一下,确保你的所有变量和常量都使用了类型推断
答案:

import UIKit

var str = "Look what I can do!"
var age = 18

var luckyNumber = 7
var costOfCandy = 1.25
var hungry = true
var name = "Ryland"

name = "Ry"

var favoriteGame = "Mario Kart"
favoriteGame = "Super Smash Bros."

let life = 42
let pi = 3.14
let canTouchThis = false
let captain = "Kirk"

let favoriteNumber = 3

比较操作符(Comparison Operators)
我们之前介绍过,playground可以做一些简单的数学运算,playground还可以比较数字和值.这些操作符包括:

  • > 大于
  • < 小于
  • == 等于
  • >= 大于等于
  • && 与操作(AND)
  • || 或操作(OR)
    你可以通过这些操作符来比较两个值.
    试一下!首先,把这些代码加到playground底部进行声明并将他们初始化:
let batmanCoolness = 10
var supermanCoolness = 9
var aquamanCoolness = 1

好的!现在使用这些变量来测试一下我们的操作符.将下面的代码写到playground末尾.

batmanCoolness < aquamanCoolness
supermanCoolness >= 8
batmanCoolness == (aquamanCoolness + supermanCoolness)
batmanCoolness > aquamanCoolness && batmanCoolness == (aquamanCoolness + supermanCoolness)
batmanCoolness < supermanCoolness || aquamanCoolness < supermanCoolness

回顾一下右侧的隐藏窗口.Playground会判断你的语句并且告诉你他们是true还是false.
图片描述
对于AND语句(&&),比较条件必须都为true.对于OR语句(||),比较条件中仅有一个必须为true.如果比较条件中的第一个为true,程序甚至不需要多此一举的去检测第二个比较条件,因为无需这样做.
挑战:尝试给Spiderman添加一个新的变量叫做spidermanCoolness,并且给他赋一个coolness值.然后尝试使用比较操作符(比如>,<,==.&&,和||)去比较Spiderman和其他超级英雄的coolness值. (注意:我将 batmanCoolness设置为了一个常量所以你无法更改它 ;) )
图片描述
答案

var spidermanCoolness = 7
(spidermanCoolness + aquamanCoolness) > supermanCoolness
spidermanCoolness == 7 && aquamanCoolness == 2

If/else语句(If/else statements)
在 if/else语句中,当条件为true时,计算机会执行某段代码块, 当条件为false时则不执行.
将下面的代码添加到playground中:

if (batmanCoolness > spidermanCoolness) {
  spidermanCoolness = spidermanCoolness - 1
} else if (batmanCoolness >= spidermanCoolness) {
  spidermanCoolness = spidermanCoolness - 1
} else {
  spidermanCoolness = spidermanCoolness + 1
}

当Batman更酷时,这段代码会减少Spiderman的coolness,反之则会增加Spiderman的coolness.
你可以从Playground中看出来,由于Spiderman没有Batman那么酷,所以他的coolness被减少到6.你可以从灰色区域中看出来,程序从未运行到else if语句中,尽管他是true的.这是因为程序已经发现第一个if语句为true,所以它不会再去运行if/else语句中的剩余部分的代码.
挑战:使用上一个例子中的超级英雄来创建你自己的控制流语句.
记住,ifelse if并不一定要为true.如果你的程序包含else语句,你的程序也可能会去执行else语句中的内容,或者直接去执行程序中接下来的内容.

答案

if(supermanCoolness < spidermanCoolness)  {
  supermanCoolness = supermanCoolness - 1 
  spidermanCoolness = spidermanCoolness + 1
} else if (supermanCoolness == spidermanCoolness)  {
  supermanCoolness = supermanCoolness + 1
  spidermanCoolness = spidermanCoolness + 1
} else  {
  supermanCoolness = supermanCoolness + 1 
  spidermanCoolness = spidermanCoolness - 1
}

简单函数(Simple Functions)
函数是去执行某个任务的代码块.比如一个叫printMyFavoriteSnack()的函数可能会打印"Pringles".
图片描述
你既可以编写和使用自己的函数,也可使用其他程序员的函数.比如,Apple公司已经提供了一系列很有用的内建(build-in)函数,他们可以被应用到你自己的apps中.
比如print()函数.当我们调用print函数时,程序会把任何你输入到括号中的内容“打印”到控制台中.
让我们赶紧来试一下.在文件尾部输入下面的内容:

print("Hello, World")

你可以看到"Hello,World"被打印到了右边.
编程会涉及到使用很多函数.有时候你会使用Apple或其他人编写的函数,,就像刚才那样,有时候你也会自己编写函数,在以后你会有更多的体会.

挑战: 尝试改变print()中的字符串去说一些关于自己的事情.或者把一个超级英雄的coolness变量放到里面看看会发生什么.
答案

print("Ry is awesome")
print(batmanCoolness)

字符串插值(String Interpolation)
向控制台打印字符串很棒,但是如果你能将一个字符串和一个从变量获取的值合并起来,在同一条语句中打印出来会不会更棒?
告诉大家个好消息!这叫做字符串插值(String Interpolation).
当你想要输出一句类似于“Sally has (some value) apples.”这样的句子,字符串插值会非常管用.在playground下面试一下这段代码:

var apples = 5
print("Sally has \(apples) apples")

看到了吗?通过使用(variable name)这样的格式,你可以把任何变量的值插入到字符串中.如果你想的话,你甚至可以在括号中执行运算操作.把这行代码添加到playground中:

print("Sally has \(apples - 5) apples")

做的好!你在写每一个程序时,几乎都会使用到字符串插值的操作.

图片描述
挑战:现在是时候来整合一些你已经学过的概念了.创建两个变量,代表班里的学生和年级:John’s grade (95), and Sam’s Grade (85).然后使用if/else语句比较John’s 和Sam’s 的年级,然后打印出John的年级是大于,小于还是等于Sam的年级.你能做到的!
答案


var johnsGrade = 95
var samsGrade = 82
if (johnsGrade < samsGrade) {
  print("\(johnsGrade) is less than \(samsGrade)")
}
else if (johnsGrade > samsGrade) {
  print("\(johnsGrade) is greater than \(samsGrade)")
}
else {
  print("\(johnsGrade) is equal to \(samsGrade)")
}

While循环(While Loops)
While循环是另一种控制流语句,就像之前学习的if/else语句一样.他们的执行都需要一个条件,这点上他们很相似.
然后,并不像if/else那样简单的执行一次代码块,当条件为true时,while语句会一直执行下去.在playground底部尝试一下这部分代码:

var secondsLeft = 3
while (secondsLeft > 0) {
  print(secondsLeft)
  secondsLeft = secondsLeft - 1
}
print("Blast off!")

请确保条件会在某刻变成false.你不会想要创建一个无限循环的程序,因为这会导致各种各样的问题,而且你的程序永远不会去执行loop之后的内容.
当你执行这段代码,你会这右边看到这行(3次),这表示print()语句每次都在运行.由于有多个值被打印出来,你必须调用一个Assistant Editor来查看结果.
为了这样做,你需要看向屏幕的上方并选择 View\Assistant Editor\Show Assistant Editor.在标记为Console Output的窗口中,你可以看到你打印的内容.
图片描述
挑战:继续尝试完成一个自己的while循环-比如创建一个警察吃一盒甜甜圈的循环.记住,不要无限循环!

var donutsLeft = 6
while(donutsLeft > 0)  {
  print("You have \(donutsLeft) donuts left")
  donutsLeft = donutsLeft - 1
  print("You eat one donut")
}
print("You are all out of donuts :(")

Break语句(Break Statement)
你的程序中已经出现了几种循环,比如while循环,当某个特殊情况发生时,你可能想要退出循环.这就是break命令的作用.在playground中尝试这个例子:

var cokesLeft = 7
var fantasLeft = 4
while(cokesLeft > 0)  {
  print("You have \(cokesLeft) Cokes left.")
  cokesLeft = cokesLeft - 1
  if(cokesLeft <= fantasLeft)  {
    break
  }
}
print("You stop drinking Cokes.")

在这个例子中,你会一直和可乐直到可乐被喝完为止,然后,你意识到你的冰箱中还有芬达.当你发现你的可乐数量少于或等于芬达时,你决定不再喝可乐了,转而去喝芬达,当这个条件发生时,你退出循环,停止喝可乐.
图片描述

挑战:现在到了你来尝试的时候了.创建一个带有结束点的while循环-比如一个关于开小差的循环,当老板开到你身边时,你才会停止开小差.在这个循环中,添加一个if语句,语句中使用break来退出循环.
答案


var goofOffTime = 10
var bossComing = 0
while(goofOffTime > 0)  {
  print("Goofing off!")
  goofOffTime = goofOffTime - 1
  bossComing = bossComing + 1
  if(goofOffTime == bossComing)  {
    break
  }
}
print("Done goofing off.")

Continue语句(Continue Statement)
continue语句跟break语句很相似,然而,它不像break语句那样退出循环,它仅仅是把程序带回到循环开始的地方.在playground中尝试下面的例子:

var numbers = 0
while(numbers <= 10)  {
  if(numbers == 9)  {
    numbers = numbers + 1
    continue
  }
  print(numbers)
  numbers = numbers + 1
}

由于你可以看到程序向控制台输出的打印信息,由于continue语句,除了9以外,0-10的数字都被打印出来.7把9给吃掉了,这太糟糕了.正是因为这个原因,你要把9排除出去

Schuming注:7 ate 9,作者讲了个冷笑话,呵呵...呵呵...

.图片描述
挑战:在你的循环中使用continue.找一个理由,让一个特定值跳过其他值都需要执行的命令,然后使用continue语句跳到循环顶端.
答案

print("List of World Wars:")
var ww = 1
while(ww <= 5)  {
  if(ww == 3 || ww == 4)  {
    ww = ww + 1
    continue
  }
  print("World War \(ww)")
  ww = ww + 1
}
print("That's the beauty of World War V, Lois. It's so intense it skips over the other two. - Peter Griffin")

可选类型(Optionals)
有时候,由于使用了不同的函数,你不确定一个变量是否会有值.当它没有值的时候,它被认为是含有nil的,
这就是可选类型被引入的原因.
可选类型是即可能包含值又可能包含nil的变量.声明一个可选变量,注意,你可以把它设为nil:

var optionalNumber: Int? = 5
optionalNumber = nil

这个 ?就意味着将变量声明为可选变量.为了弄清楚可选变量到底包含值还是nil,你可以使用一个叫做if let的语句,它看起来是这样的:

if let number = optionalNumber

if let语句很像 if 语句. 如果optionalNumber 包含一个Int值, number就会被置为这个值,if let大括号中的内容会被执行.
可选的操作是,你可以创建一个else语句,当optionalNumber 碰巧为nil时去执行else中的内容.
挑战:自己尝试一下,为optionalNumber 完成一个if let语句,当它包含值或者为nil时去打印不同的字符串.
答案

if let number = optionalNumber  {
  print("It is a number")
}
else  {
  print("It is not a number")
}

类型转换(Conversion Between Data Types)
让我们来看看这个在程序中的用途.可选类型能帮助你转换变量类型.尝试下面的例子,把一个字符串转换为一个Int型:

var languagesLearned: String = "3"
var languagesLearnedNum: Int? = Int(languagesLearned)

这里,在声明languagesLearned 为字符串类型并初始化为"3"之后,你声明了可选类型变量languagesLearnedNum并且通过toInt()方法(Methods)对其进行初始化.方法(Methods)和之前学到的函数,比如print()函数很相似, 不同之处是,方法是类的一部分. 之后你很快会学到这部分内容.
Int()是一个可以让你从一个string值中创建一个新的int型值的构造函数(constructor).之所以要把像languagesLearnedNum这样的可选类型赋予那样的值是因为它有可能成为nil.当你试图转换的String不包含一个数字的值,但是包含"Hello,World"这样的值时,这种情况就会发生.
输入下面的代码来测试一下:

if let num = languagesLearnedNum  {
  print("It is a number")
}
else  {
  print("It is not a number")
}

if let 语句用来测试languagesLearnedNum到底是包含一个值还是nil.如果它包含一个值,这个值会被传给num并且大括号中的代码会被执行.如果不是这样,else大括号中的代码就会被执行.
如果你把languagesLearned的值改为“Three”,看看会发生生么.程序会在控制台上打印"It is not a number",因为当程序试图将"Three"转换为一个Int型时,languagesLearnedNum 会被置为nil.


整合所有内容
挑战:最后一个!尝试创建你自己的变量,并将其从String转换为Int.然后,在一个包含print()的if语句中,将这些变量和另一些变量进行比较.这些print()函数应该包含通过字符串插值处理过的字符串,因此你可以比较出这些值的大小.
图片描述

答案:

var tutorialTeam: String = "55"
var editorialTeam = 23

var tutorialTeamNum: Int? = Int(tutorialTeam)

if let numTutorial = tutorialTeamNum  {
  if(numTutorial > editorialTeam)  {
    print("\(numTutorial) is greater than \(editorialTeam)")
  } else if (numTutorial < editorialTeam) {
    print("\(numTutorial) is less than \(editorialTeam)")
  } else  {
    print("\(numTutorial) is equal to \(editorialTeam)")
  }
} else  {
  print("Invalid entry")
}

接下来该做些什么?
这里有这个教程目前为止,完整的playground文件.
看一下这个系列接下来的部分,你将会学习到怎样通过你的Swift语言知识去创建一个简单的命令行猜数字游戏.


Schuming注:作者信息在下面:向一切有分享精神的人致敬!一鞠躬!二鞠躬 !三鞠躬!
while(1){ 鞠躬!鞠躬!鞠躬!}

图片描述
Brian Moakley
Brian is not only an iOS developer and fiction writer, he also holds the honor being Razeware‘s first fulltime employee.

Brian joins Razeware with experience from companies such as ESPN’s online fantasy team and Disney’s Internet Group. When not writing or coding, Brian enjoys story driven first person shooters, reading some great books, and he runs his own "Let's Play" channel on YouTube.

Follow Brian Moakley on Twitter

点击查看更多内容
7人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
Linux系统工程师
手记
粉丝
9
获赞与收藏
211

关注作者,订阅最新文章

阅读免费教程

感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消