更新于4/13/15:下面文章是基于 Xcode 6.3 / Swift 1.2。
入门指南
首先要下载app开发软件----xcode。可以到apple app store上免费下载。
确保下载xcode最新版本,xcode6及以上版本才支持swift。
安装xcode后,打开并点击 Get started with a playground.
playground非常便于学习swift编程。你不需要像iPhone app一样去运行playground,它对于你学习swift的基础语法非常有帮助。
name设置为MyPlayground,platform设置为ios,然后点击next,保存在任意地方。
playground的介绍
进过前面的操作后,你会发现playground已经创建了3行代码:
// Playground - noun: a place where people can play
import UIKit
var str = "Hello, playground"
以//开头的第一行是注释。
你可以将第二行import UIKit暂时理解为一群smart folks聪明人在apple上写的一大串代码。目前你只需要知道这行对于你后面编写代码是有用的就ok。
第三行代码
var str = "Hello, playground"
是你目前需要关注的。表示创建了一个名为
str的变量,其值为
Hello, playground
.在窗口的右边,你会看到xcode一直显示着该变量的值。
可以试着修改下变量str的值为"Look what I can do!"
,如下:
var str = "Look what I can do!"
这时你会发现窗口右边显示的内容也变成了"Look what I can do!",
恭喜,你刚刚进行了编程工作。
你的个人计算器
接下来再来看看我们还能做些什么。在前面的文件末尾,试试输入一个基本的数学算术2 + 2,然后回车,playground将在窗口的右边显示出这个等式的值。
很酷吧!你还可以做其他数学运算。
挑战一下:利用playground计算123*456的值
在你的playground里输入
123*456
在窗口的右边立马就能显示出结果:
56,088
接下来我们在playground上做更多的编程。除了保留import UIKit这一条语句,其他的都先删掉。
变量
接下来,我们来做一些有关变量的操作。
采用下面的语法来创建一个变量:
var yourVariableName: yourType = yourInitialValue
yourVariableName
: 变量名,你可以任意取名,例如str或age等
yourType
:变量类型,例如 String
or Int
初值。yourInitialValue:
举个例子,将下面的代码加到playground的尾部:
var str: String = "Look what I can do!"
var age: Int = 18
第一行的代码中,创建了一个名为str的变量,其类型为String,初始值为 “Look what I can do!”
第二行,创建了一个类型为Int的变量age,初值为18
下面简单介绍下不同的类型:
Types类型
如下是swift提供的一些基本类型:
- Int
- Double
- Bool
- String
输入下面的代码进行练习,观察窗口右边的显示结果:
var luckyNumber: Int = 7
var costOfCandy: Double = 1.25
var hungry: Bool = true
var name: String = "Ryland"
创建一个变量后,可以修改其值,如下代码:
name = "Ry"
var favoriteGame: String = "Mario Kart"
favoriteGame = "Super Smash Bros."
Constants常量
常量用let来创建,其值是不能修改的。编写代码时,如果可以尽可能的使用常量而非变量,因为编译器不用计算值发送变化的可能性,程序会运行的更快。任何一个数据类型都可以被定义为一个常量或是变量。
let life: Int = 42
let pi: Double = 3.14
let canTouchThis: Bool = false
let captain: String = "Kirk"
如果你对一个常量的值进行修改,如下代码,那么代码的左边会出现一个红色的感叹号,告诉你出错了!
captain = "Hook"
点击红色的感叹号,会出现
Cannot assign to ‘let’ value ‘captain’
不能给常量重新指定值的消息。一旦你用let定义了一个常量,就表示这个常量的值是不能改变的。
删除之前出错的代码,出错告警就会消除。
Inferred Typing隐式类型推断
swift可以根据声明的变量或常量的信息自动推断出数据类型,只要信息足够,而不用每次都指定数据类型。如此不仅效率高,而且代码更简明和易读
尝试将前面的
var luckyNumber: Int = 7
替换为如下:
|
虽然现在看起来没有什么很大的变化,但是在运行的时候会帮你节省很多类型转换的工作。
luckyNumber
设置为 Double
, 你必须给其赋值为 7.0
可以进行如下尝试:
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除了能进行前面所介绍的数学运算外,也能比较两个值,基本的比较运算符如下:
- >
- <
- ==
- >= 大于或等于
- <= 小于或等于
- &&
- ||
尝试添加如下代码:
|
|
var spidermanCoolness = 7
(spidermanCoolness + aquamanCoolness) > supermanCoolness
spidermanCoolness == 7 && aquamanCoolness == 2
playground在窗口的右边会计算出相应的值为true或false.
&&
)的 两个值必须都为true,其结果才为true. 参与或运算 (||
)的两个值只要其中一个为真,其结果为真,如果第一个值已经为true,那就没有必要关心第二个值。 .
If/else statements
在if/else语句中,当判断条件为真时才会执行{}里面的内容,条件为假时不执行。如下代码:
|
Batman更酷些,那Spiderman的酷值就是减一,相反如果Spiderman更酷些,那Spiderman的酷值就会加一。
你从playground中可以看到Spiderman的酷值降到6.
另外,你会发生上面代码块中的else if都没有执行过,即使它的判断条件时true,那是因为第一个if的判断条件已经为true,所以后面的跳转分支就不用管了。
尝试输入下面的代码,看下结果:
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提供了很多非常有用的内部库函数。你可以在你的app中使用。
比如println()
“Hello, World”:
|
尝试输入下面的代码,看下打印的结果
| |
|
| | |
|
String Interpolation字符串的插入
字符串插入可以将字符串和变量的值在一条语句中打印出来,如下:
var apples = 5
println("Sally has \(apples) apples")
println("Sally has \(apples - 5) apples")
使用格式
\(variable name)
,可以将任何变量的值以字符串的形式打印出来
输入下面的代码,看下结果:
var johnsGrade = 95
var samsGrade = 82
if (johnsGrade < samsGrade) {
println("\(johnsGrade) is less than \(samsGrade)")
}
else if (johnsGrade > samsGrade) {
println("\(johnsGrade) is greater than \(samsGrade)")
}
else {
println("\(johnsGrade) is equal to \(samsGrade)")
}
While Loops while循环
while循环是类似于if /else的另一种流程控制,同样也需要条件为true才能执行.不同的是,只要执行条件一直为true,那么{}中的代码块就会继续被执行。
|
确保你的循环流程能在某个点停止。不要编写无限循环的流程控制,不然会导致各种问题,而且你的程序除了这个流程,其他什么也不能做。
上面的代码运行后,窗口的右边会显示(3 times)
,告诉你这条语句运行了几次。同时,你可以在屏幕的最上面选择 View\Assistant Editor\Show Assistant Editor,打开另一个窗口Assistant Editor 来看具体的运行结果。
var donutsLeft = 6
while(donutsLeft > 0) {
println("You have \(donutsLeft) donuts left")
donutsLeft = donutsLeft - 1
println("You eat one donut")
}
println("You are all out of donuts :(")
Break Statement break语句
在循环语句中,比如while循环,可以通过break语句在特定的事件中跳出循环。.
|
drinking Coke 。然而当你知道冰箱里有汽水时,你可以决定当cofe的数量小于或等于汽水时,选择去喝汽水。当这个条件发生时,你就退出了循环,也就停止了喝咖啡。
|
| | |
|
Continue Statement continue语句
continue语句和break语句非常相似,区别在于,continue不是退出整个循环,只是跳出当前这一轮循环,程序回到循环的开始处,然后进行条件的判断是否执行下一轮循环。.
|
println("List of World Wars:")
var ww = 1
while(ww <= 5) {
if(ww == 3 || ww == 4) {
ww = ww + 1
continue
}
println("World War \(ww)")
ww = ww + 1
}
println("That's the beauty of World War V, Lois. It's so intense it skips over the other two. - Peter Griffin")
.
Optionals可选性
nil
. nil
:
|
?
|
if let
等同于if
|
|
|
Conversion Between Data Types数据类型的转换
String
转换为 Int
.
|
"3"
的字符串变量 languagesLearned
,以及一个可选变量languagesLearnedNum
并调用函数 toInt()
.给其赋初值 。Methods are very similar to functions likeprintln()
that you learned earlier, except that they are a part of a class
. You will learn more about that later.toInt()同println()
方法一样都是已经实现了的,是一个类的一部分,这个在后面会学到更多。 该方法是将 String
以 Int
类型输出. 之所以将 languagesLearnedNum
声明为可选性,是因为它的值有可能是 nil
. 比如你要转换的字符串不包含数字,而是像"Hello, World"
.
输入下面的代码:
|
var tutorialTeam: String = "55"
var editorialTeam = 23
var tutorialTeamNum: Int? = tutorialTeam.toInt()
if let numTutorial = tutorialTeamNum {
if(numTutorial > editorialTeam) {
println("\(numTutorial) is greater than \(editorialTeam)")
}
else if (numTutorial < editorialTeam) {
println("\(numTutorial) is less than \(editorialTeam)")
}
else {
println("\(numTutorial) is equal to \(editorialTeam)")
}
}
else {
println("Invalid entry")
}