Swift编程语言入门教程
简单介绍
Swift是用于iOS和OS X应用开发的新编程语言,基于C和Objective-C,但避免了C语言的一些兼容性约束。它采用安全的编程模式并加入现代功能,使得编程更加简单、灵活和有趣。界面基于广受欢迎的Cocoa和Cocoa Touch框架,展示了软件开发的新方向。
Swift已经存在多年,Apple基于已有的编译器、调试器、框架作为基础架构,通过ARC(自动引用计数)简化内存管理。框架栈一直基于Cocoa,Objective-C进化支持了块、集合字面量和模块,允许现代语言框架无需深入即可使用。这些基础工作使得在Apple软件开发中引入新编程语言成为可能。
Objective-C开发者会对Swift感到熟悉,因为它采用了Objective-C的命名参数和动态对象模型,提供了对Cocoa框架和混合互操作性的支持。基于这些,Swift引入了许多新功能,结合了面向过程和面向对象的特性。
Swift对新程序员也很友好,它是工业级品质的系统编程语言,却像脚本语言一样易于上手。支持playground功能,允许程序员实验Swift代码并立即看到结果,无需构建和执行整个应用。
Swift集成了现代编程语言思想和Apple工程文化的智慧,编译器针对性能优化,语言针对开发优化,无需折中。可以从“Hello, world”开始学习,逐步过渡到整个系统,这使得Swift成为Apple软件开发者创新的源泉。
Swift是编写iOS和OS X应用的理想方式,并将持续引入新功能。
Swift入门
学习新语言通常从打印“Hello, world”开始。在Swift中,只需一行代码:
println("Hello, world")
如果你熟悉C或Objective-C,这个语法看起来类似。在Swift中,这就是完整程序,无需导入单独库进行输入输出和字符串处理。全局范围的代码作为程序入口,因此无需编写main()函数,也不需要在每个语句后写分号。
本章提供足够信息完成编程任务,任何未解释的内容将在后续详细说明。
简单值
使用let定义常量,var定义变量。常量的值无需在编译时指定,但必须至少赋值一次,这意味着你可以命名一个值,在多个地方使用。
例如:
var myVariable = 42
myVariable = 50
let myConstant = 42
常量或变量必须与赋值时类型一致,因此无需严格定义类型。编译器会根据初始化值推断类型,如myVariable被推断为整数类型。
如果初始化值信息不足或没有初始化值,可以在变量名后指定类型,以冒号分隔:
let implicitInteger = 70
let implicitDouble = 70.0
let explicitDouble: Double = 70
值永远不会隐含转换到其他类型。如需转换,必须显式构造所需类型的实例:
let label = "The width is "
let width = 94
let widthLabel = label + String(width)
更简单的方法是在字符串中包含值:使用小括号并在前加反斜线,例如:
let apples = 3
let oranges = 5
let appleSummary = "I have \(apples) apples."
let fruitSummary = "I have \(apples + oranges) pieces of fruit."
创建数组和字典使用方括号[],访问元素通过索引或键:
var shoppingList = ["catfish", "water", "tulips", "blue paint"]
shoppingList[1] = "bottle of water"
var occupations = ["Malcolm": "Captain", "Kaylee": "Mechanic"]
occupations["Jayne"] = "Public Relations"
创建空数组或字典使用初始化语法:
let emptyArray = String[]()
let emptyDictionary = Dictionary<String, Float>()
如果类型信息可推断,可以写空数组为[]和空字典为[:],例如:
shoppingList = []
控制流
使用if和switch进行条件控制,使用for-in、for、while、do-while进行循环。小括号可选,但主体大括号必需。
例如,使用if语句:
let individualScores = [75, 43, 103, 87, 12]
var teamScore = 0
for score in individualScores {
if score > 50 {
teamScore += 3
} else {
teamScore += 1
}
}
在if语句中,条件必须是布尔表达式,不能隐含与0比较。
结合if和let处理可选值,防止值丢失。可选值可以包含值或nil,表示值不存在。在类型后加问号?表示可选:
var optionalString: String? = "Hello"
optionalString == nil
var optionalName: String? = "John Appleseed"
var greeting = "Hello!"
if let name = optionalName {
greeting = "Hello, \(name)"
}
如果可选值为nil,条件为false,代码块被跳过;否则,可选值被解包并赋给常量。
switch支持多种数据类型和比较,不限于整数和相等测试:
let vegetable = "red pepper"
switch vegetable {
case "celery":
let vegetableComment = "Add some raisins and make ants on a log."
case "cucumber", "watercress":
let vegetableComment = "That would make a good tea sandwich."
case let x where x.hasSuffix("pepper"):
let vegetableComment = "Is it a spicy \(x)?"
default:
let vegetableComment = "Everything tastes good in soup."
}
匹配后,程序从switch跳出,无需使用break。
使用for-in迭代字典中的键值对:
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
}
}
}
使用while重复代码块直到条件改变,循环条件可放在末尾以确保至少执行一次:
var n = 2
while n < 100 {
n = n * 2
}
var m = 2
do {
m = m * 2
} while m < 100
在循环中保持索引,通过..表示范围或显式声明初始值、条件、增量:
var firstForLoop = 0
for i in 0..3 {
firstForLoop += i
}
var secondForLoop = 0
for var i = 0; i < 3; ++i {
secondForLoop += 1
}
使用..构造范围忽略最高值,...构造的范围包括两个值。