Swift上手一览:基础知识

Swift上手一览

按照程序届的老传统,上手一门新的语言,大多是从屏幕上打印Hello, world!开始!在Swift当中,这个做起来不要太简单哦!

1
print("Hello, world!")

如果你之前有写过C或者Objective-C,这行代码对你来说,简直简单到哭对不对?在swift中,这行代码即是一个完整的程序!你无需蛋疼的加载库(比如,输入、输出、字符串处理)!这行代码是全局的,所以你不需要再编写一个main()函数来执行。而且,发现没用,我们根本就不用在语句后面写分号;

接下来,本文将会给你大量的信息让你去熟悉swift!有了这篇文章,你压根儿无需担心不懂swift!这里的注释和实例十分的完整!

1
2
Note
为了快、更方便的上手swift,我们建议你下载本文的Playgrounds文件,然后使用Xcode打开!Playground文件是一个能实时呈现swift执行效果的牛逼工具!附上下载地址

点我下载文章对应的playground

简单值类型

使用let定义常量、使用var定义变量。常量的值是无需经过编译的,但是你必须在使用时给其赋值!这句话的意思是,常量是一个一次定义,多处可用的量!

1
2
3
var myVariable = 42
myVariable = 50
let myConstant = 42

无论是常量还是变量,在赋值的时候,我们必须给它赋值称为其自身对应的数据类型!但是很多时候,你并不需要明确的指明它的类型!因为,swift会自动推断出你的数据类型!在上面的例子当中,myVariable是一个整形!因为我们给它赋值是一个整数!

如果初始值不明确(或者没用初始值),这个时候我们可以通过:来明确指定变量或者常量的数据类型!

1
2
3
let implicitInteger = 70
let implicitDouble = 70.0
let explicitDouble: Double = 70
1
2
EXPERIMENT
请尝试定义一个`Float`类型的常量,并且赋值为`4`

swift从来不会隐式的把一个数据类型转换称为另外一种类型!如果你需要转换类型,那么你就需要明确的指出!

1
2
3
let label = "The width is "
let width = 94
let widthLabel = label + String(width)
1
2
EXPERIMENT
请尝试一处上面代码的`String`,看看得到了什么错误!

如果你需要将值类型的数据和String在一起拼成字符串,这里有一个很简单的方法--在字符串中写(YourValue)即可!

1
2
3
4
let apples = 3
let oranges = 5
let appleSummary = "I have \(apples) apples."
let fruitSummary = "I have \(apples + oranges) pieces of fruit."
1
2
EXPERIMENT
请尝试在字符串中使用\()添加各种值类型的数据,并实现给某人打招呼的功能

在swift创建数组或者字典可使用在中括号([])中写入索引与值的方式。值或者健值对之间使用逗号(,)隔开!至于最后一个或者一对数据,一般情况下我们习惯不添加逗号,但是如果你喜欢,添加了也没啥大问题!

1
2
3
4
5
6
7
8
var shoppingList = ["catfish", "water", "tulips", "blue paint"]
shoppingList[1] = "bottle of water"
var occupations = [
"Malcolm": "Captain",
"Kaylee": "Mechanic",
]
occupations["Jayne"] = "Public Relations"

如果你需要创建空数组或者空字典,可以参照以下的方法来做

1
2
let emptyArray = [String]()
let emptyDictionary = [String: Float]()

当然,如果你的数组或者字典里面的数据的类型是可以通过推断来识别数据类型(比如你的数据来自另一个方法或者其它可以确定数据类型的途径!),那么你也可以不定义数据类型(需要注意的是,数组或者字典当中的数据类型都是统一的!)。其具体格式如下

1
2
shoppingList = []
occupations = [:]

控制流

使用ifswitch来建立条件,使用for-in, `for,whilerepeat-while` 来建立循环。条件语句或者循环语句当中的小括号(),是可以省略的,但是流程体的大括号是必须书写的(*这一点和其它语言不同!)!

1
2
3
4
5
6
7
8
9
10
let individualScores = [75, 43, 103, 87, 12]
var teamScore = 0
for score in individualScores {
if score > 50 {
teamScore += 3
} else {
teamScore += 1
}
}
print(teamScore)

if条件语句中,语句的值必须是一个bool类型的表达式!意思是说,把取值作为条件是错误的!if score{...}这种方式是错误的!

你可以使用iflet并在一起的方式来完成可能没有取值的情形的操作!类似这种可能没有取值的数据我们称之为可选值!一个可选值的数据可能是一个正常的值,也可能是一个nil(当数据值丢失时)!这个时候,我们可以在数据类型后面添加一个问号(?)来标注变量是一个可选值!

1
2
3
4
5
6
7
8
var optionalString: String? = "Hello"
print(optionalString == nil)
var optionalName: String? = "John Appleseed"
var greeting = "Hello!"
if let name = optionalName {
greeting = "Hello, \(name)"
}
1
2
3
EXPERIMENT
1,将可选值的取值改为nil,看看发生了什么?
2,尝试添加一个 else 分支来接受可选值为nil的情况!

如果可选值为nil,那么条件则为false,并且if{}区块的代码将会跳过执行!否则,这个可选项的值将会拆包,并且会被分配到let定义的常量上!这样以来,拆包操作使得区块中的代码可以正常直行!

另外一种处理可选项的方式时使用??操作符来给它定义一个初始值!如果可选项的取值丢失,那么默认值将会生效!

1
2
3
4
let nickName: String? = nil
let fullName: String = "John Appleseed"
let informalGreeting = "Hi \(nickName ?? fullName)"
// 对比感受一下:::nickName ? nickName:fullName

switch分支支持各种数据类型,甚至是表达式!这货不会拘泥为integers,也仅仅能表现为相等!

1
2
3
4
5
6
7
8
9
10
11
let vegetable = "red pepper"
switch vegetable {
case "celery":
print("Add some raisins and make ants on a log.")
case "cucumber", "watercress":
print("That would make a good tea sandwich.")
case let x where x.hasSuffix("pepper"):
print("Is it a spicy \(x)?")
default:
print("Everything tastes good in soup.")
}
1
2
EXPERIMENT
尝试去掉default分支,看看什么发生了!

需要注意的是,在使用了表达式分支的情况下,只需要取值和分支的case的取值一致即可!

在执行完对应分支的代码之后,程序会自动跳出当天分支,也不会继续下一个分支,而是直接跳出swith代码!所以,你不需要手动写break去跳出程序!同时,在swift的switch当中default也是必须的!

你可以通过for-in来迭代循环字典当中的健值对!字典是一个无序的集合!所以,迭代出来的数据也是无序的!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
let interestingNumbers = [
"Prime": [2, 3, 5, 7, 11, 13],
"Fibonacci": [1, 1, 2, 3, 5, 8],
"Square": [1, 4, 9, 16, 25],
]
var largest = 0
for (kind, numbers) in interestingNumbers {
for number in numbers {
if number > largest {
largest = number
}
}
}
print(largest)
1
2
EXPERIMENT
在上面的代码中新增一个变量,来纪录某个数据的所属类型!

使用while去重复一段代码,直到条件不再满足!

1
2
3
4
5
6
7
8
9
10
11
var n = 2
while n < 100 {
n = n * 2
}
print(n)
var m = 2
repeat {
m = m * 2
} while m < 100
print(m)

你可以在..<循环体中使用索引来执行一个区间范围。

1
2
3
4
5
var total = 0
for i in 0..<4 {
total += i
}
print(total)

..<不包含末尾取值,...包含末尾取值!

1
2
0..<4 => 0,1,2,3
0...4 => 0,1,2,3,4