Swift编程语言入门教程

Viewed 0

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 = []

控制流

使用ifswitch进行条件控制,使用for-inforwhiledo-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比较。

结合iflet处理可选值,防止值丢失。可选值可以包含值或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
}

使用..构造范围忽略最高值,...构造的范围包括两个值。

0 Answers