Swift教程

Swift基础

Swift是一种新的编程语言,用于iOS和OS X应用程序,建立在最佳的C和Objective-C上,没有C语言的兼容性的限制。Swift采用安全的编程模式,并增加了现代的功能,使编程更容易,更灵活,更有趣。Swift由成熟和备受宠爱 Cocoa 和 Cocoa Touch触摸框架支持,重新构想软件开发工作。

Swift是多年的酝酿。苹果公司通过推动现有的编译器,调试器和框架的基础奠定了Swift的基础。我们简化了存储管理,自动引用计数(ARC)。框架协议栈,基于Foundation 和 Cocoa已实现了现代化和整个标准化。 Objective-C语言本身已经进化到支持块,集合文字和模块,使框架采用现代语言技术不中断。由于这些基础块,我们现在可以引入苹果软件开发的未来一种新的语言。

Swift对熟悉Objective-C语言的开发人员,采用Objective-C语言的命名参数和Objective-C中动态对象模型的可读性。它提供了无缝接入现有的Cocoa框架和混合匹配与Objective-C代码的互操作性。从这个共同点创建,Swift引入了许多新的特性及统一语言程序和面向对象的部分。

Swift对新的程序员是十分友好的。它是第一个获得工业质量的系统编程语言。它支持一个创新的功能,它允许程序员编写Swift代码并立即看到结果,无需建立和运行一个应用程序的开销。

Swift结合了最好的现代语言与思维从更广泛的苹果工程师文化的智慧。编译器针对性能进行了优化,语言的发展进行了优化,无需任何牺牲。它的设计从“hello, world”扩展到整个操作系统。这一切都使得Swift的开发者和苹果的未来投资。

Swift是一个很好的方式来写iOS和OS X应用程序,并且将继续发展与新特性和功能。Swift目标雄心勃勃。我们不能等待,看看你用它创造什么。

Swift常量和变量

常量和变量相关联的名称 (如 maximumNumberOfLoginAttempts 或 welcomeMessage) 与特定类型的值 (如数字 10 或 字符串 "Hello")。常量一旦它被设定值不能被改变,而变量可以以后被设置为不同的值。

声明常量和变量

在使用之前常量和变量必须先声明。 你可以使用 let 关键字声明常量,使用 var 声明变量. 下面是如何将常量和变量用于跟踪用户尝试登录次数的一个例子:

let maximumNumberOfLoginAttempts = 10
var currentLoginAttempt = 0

此代码可以理解为:

“声明一个常量名为 maximumNumberOfLoginAttempts, 它的给定值是 10. 然后声明另外一个变量是 currentLoginAttempt, 给定的初始值是 0.”

在这个例子中,允许尝试登录的最大次数被声明为一个常数,因为最大的值不可改变。 当前的登录尝试计数器被声明为一个变量,因为该值必须在每次登录尝试失败后递增。

可以声明多个常数或多个变量在一行上,用逗号分隔:

var x = 0.0, y = 0.0, z = 0.0

类型注释

当声明一个常量或变量,可以提供一个类型注释 type annotation,能够清楚看到类型值的常量或变量可以存储。通过将常量或变量名后一个冒号,后跟一个空格,然后使用类型的名称写入类型注释。

这个例子提供了一个类型标注为一个名为welcomeMessage变量,以表示该变量可以存储字符串 String 值:

var welcomeMessage: String

在声明中冒号的意思是“...类型...”,所以上面的代码中可以读作:

“声明一个变量 welcomeMessage 它的类型为 String.”

“ String的类型”这句话的意思是“可以存储任何字符串值”。把它看成意思是“东西的类型”(或“那种类型”),可以存储。

welcomeMessage变量现在可以设置为不带任何错误字符串值:

welcomeMessage = "Hello"

命名常量和变量

几乎可以使用任何你喜欢的字符常量和变量名,包括Unicode字符:

let π = 3.14159
let 你好 = "你好世界"
let

输出常量和变量

你可以用println函数来输出当前常量或变量的值:

println(friendlyWelcome)

// 输出 "Bonjour!"

println是一个用来输出的全局函数,输出的内容会在最后换行。如果你用 Xcode,println将会输出内容到“console”面板上。(另一种函数叫print,唯一区别是在输出内容最后不会换行。)

println函数输出传入的String值:

println("This is a string")

// 输出 "This is a string"

与 Cocoa 里的NSLog函数类似的是,println函数可以输出更复杂的信息。这些信息可以包含当前常量和变量的值。

Swift 用字符串插值(string interpolation)的方式把常量名或者变量名当做占位符加入到长字符串中,Swift 会用当前常量或变量的值替换这些占位符。将常量或变量名放入圆括号中,并在开括号前使用反斜杠将其转义:

println("The current value of friendlyWelcome is \(friendlyWelcome)")

// 输出 "The current value of friendlyWelcome is Bonjour!

注意:
字符串插值所有可用的选项,请参考字符串插值。

Swift基本运算符

基本运算符

本页包含内容:

术语
赋值运算符
数值运算符
组合赋值运算符(Compound Assignment Operators)
比较运算符
三元条件运算符(Ternary Conditional Operator)
区间运算符
逻辑运算符

运算符是检查,改变,合并值的特殊符号或短语。例如,加号+将两个数相加(如let i = 1 + 2)。复杂些的运行算例如逻辑与运算符&&(如if enteredDoorCode && passedRetinaScan),又或让 i 值加1的便捷运算符自增运算符++i等。

Swift 支持大部分标准 C 语言的运算符,且改进许多特性来减少常规编码错误。如,赋值符(=)不返回值,以防止把想要判断相等运算符(==)的地方写成赋值符导致的错误。数值运算符(+,-,*,/,%等)会检测并不允许值溢出,以此来避免保存变量时由于变量大于或小于其类型所能承载的范围时导致的异常结果。当然允许你使用 Swift 的溢出运算符来实现溢出。详情参见溢出运算符。

区别于 C 语言,在 Swift 中你可以对浮点数进行取余运算(%),Swift 还提供了 C 语言没有的表达两数之间的值的区间运算符,(a..b和a...b),这方便我们表达一个区间内的数值。

本章节只描述了 Swift 中的基本运算符,高级运算符包含了高级运算符,及如何自定义运算符,及如何进行自定义类型的运算符重载。

Swift字符串和字符

本页包含内容:

字符串字面量
初始化空字符串
字符串可变性
字符串是值类型
使用字符
计算字符数量
连接字符串和字符
字符串插值
比较字符串
字符串大小写
Unicode

String是例如“hello, world”,“海贼王” 这样的有序的Character(字符)类型的值的集合,通过String类型来表示。

Swift 的String和Character类型提供了一个快速的,兼容 Unicode 的方式来处理代码中的文本信息。 创建和操作字符串的语法与 C 语言中字符串操作相似,轻量并且易读。 字符串连接操作只需要简单地通过+号将两个字符串相连即可。 与 Swift 中其他值一样,能否更改字符串的值,取决于其被定义为常量还是变量。

尽管语法简易,但String类型是一种快速、现代化的字符串实现。 每一个字符串都是由独立编码的 Unicode 字符组成,并提供了以不同 Unicode 表示(representations)来访问这些字符的支持。

Swift 可以在常量、变量、字面量和表达式中进行字符串插值操作,可以轻松创建用于展示、存储和打印的自定义字符串。

注意:
Swift 的String类型与 Foundation NSString类进行了无缝桥接。如果您利用 Cocoa 或 Cocoa Touch 中的 Foundation 框架进行工作。所有NSString API 都可以调用您创建的任意String类型的值。除此之外,还可以使用本章介绍的String特性。您也可以在任意要求传入NSString实例作为参数的 API 中使用String类型的值作为替代。 更多关于在 Foundation 和 Cocoa 中使用String的信息请查看使用Swift 及Cocoa and Objective-C。

Swift集合类型 (Collection Types)

本页包含内容:

数组(Arrays)
字典(Dictionaries)
集合的可变性(Mutability of Collections)

Swift 语言提供经典的数组和字典两种集合类型来存储集合数据。数组用来按顺序存储相同类型的数据。字典虽然无序存储相同类型数据值但是需要由独有的标识符引用和寻址(就是键值对)。

Swift 语言里的数组和字典中存储的数据值类型必须明确。 这意味着我们不能把不正确的数据类型插入其中。 同时这也说明我们完全可以对获取出的值类型非常自信。 Swift 对显式类型集合的使用确保了我们的代码对工作所需要的类型非常清楚,也让我们在开发中可以早早地找到任何的类型不匹配错误。

注意:
Swift 的数组结构在被声明成常量和变量或者被传入函数与方法中时会相对于其他类型展现出不同的特性。 获取更多信息请参见集合的可变性与集合在赋值和复制中的行为章节。

Swift控制流

本页包含内容:

For 循环
While 循环
条件语句
控制转移语句(Control Transfer Statements)

Swift提供了类似 C 语言的流程控制结构,包括可以多次执行任务的for和while循环,基于特定条件选择执行不同代码分支的if和switch语句,还有控制流程跳转到其他代码的break和continue语句。

除了 C 语言里面传统的 for 条件递增(for-condition-increment)循环,Swift 还增加了for-in循环,用来更简单地遍历数组(array),字典(dictionary),区间(range),字符串(string)和其他序列类型。

Swift 的switch语句比 C 语言中更加强大。在 C 语言中,如果某个 case 不小心漏写了break,这个 case 就会贯穿(fallthrough)至下一个 case,Swift 无需写break,所以不会发生这种贯穿(fallthrough)的情况。case 还可以匹配更多的类型模式,包括区间匹配(range matching),元组(tuple)和特定类型的描述。switch的 case 语句中匹配的值可以是由 case 体内部临时的常量或者变量决定,也可以由where分句描述更复杂的匹配条件。

Swift函数

函数(Functions)

本页包含内容:

函数定义与调用(Defining and Calling Functions)
函数参数与返回值(Function Parameters and Return Values)
函数参数名称(Function Parameter Names)
函数类型(Function Types)
函数嵌套(Nested Functions)

函数是用来完成特定任务的独立的代码块。你给一个函数起一个合适的名字,用来标识函数做什么,并且当函数需要执行的时候,这个名字会被“调用”。

Swift 统一的函数语法足够灵活,可以用来表示任何函数,包括从最简单的没有参数名字的 C 风格函数,到复杂的带局部和外部参数名的 Objective-C 风格函数。参数可以提供默认值,以简化函数调用。参数也可以既当做传入参数,也当做传出参数,也就是说,一旦函数执行结束,传入的参数值可以被修改。

在 Swift 中,每个函数都有一种类型,包括函数的参数值类型和返回值类型。你可以把函数类型当做任何其他普通变量类型一样处理,这样就可以更简单地把函数当做别的函数的参数,也可以从其他函数中返回函数。函数的定义可以写在在其他函数定义中,这样可以在嵌套函数范围内实现功能封装。

Swift闭包

闭包(Closures)

本页包含内容:

闭包表达式(Closure Expressions)
尾随闭包(Trailing Closures)
值捕获(Capturing Values)
闭包是引用类型(Closures Are Reference Types)

闭包是自包含的函数代码块,可以在代码中被传递和使用。 Swift 中的闭包与 C 和 Objective-C 中的代码块(blocks)以及其他一些编程语言中的 lambdas 函数比较相似。

闭包可以捕获和存储其所在上下文中任意常量和变量的引用。 这就是所谓的闭合并包裹着这些常量和变量,俗称闭包。Swift 会为您管理在捕获过程中涉及到的所有内存操作。

注意:
如果您不熟悉捕获(capturing)这个概念也不用担心,您可以在 值捕获 章节对其进行详细了解。
 

在函数 章节中介绍的全局和嵌套函数实际上也是特殊的闭包,闭包采取如下三种形式之一:

全局函数是一个有名字但不会捕获任何值的闭包
嵌套函数是一个有名字并可以捕获其封闭函数域内值的闭包
闭包表达式是一个利用轻量级语法所写的可以捕获其上下文中变量或常量值的匿名闭包

Swift 的闭包表达式拥有简洁的风格,并鼓励在常见场景中进行语法优化,主要优化如下:

利用上下文推断参数和返回值类型
隐式返回单表达式闭包,即单表达式闭包可以省略return关键字
参数名称缩写
尾随(Trailing)闭包语法

枚举(Enumerations)

本页内容包含:

枚举语法(Enumeration Syntax)
匹配枚举值与Swith语句(Matching Enumeration Values with a Switch Statement)
相关值(Associated Values)
原始值(Raw Values)

枚举定义了一个通用类型的一组相关的值,使你可以在你的代码中以一个安全的方式来使用这些值。

如果你熟悉 C 语言,你就会知道,在 C 语言中枚举指定相关名称为一组整型值。Swift 中的枚举更加灵活,不必给每一个枚举成员提供一个值。如果一个值(被认为是“原始”值)被提供给每个枚举成员,则该值可以是一个字符串,一个字符,或是一个整型值或浮点值。

此外,枚举成员可以指定任何类型的相关值存储到枚举成员值中,就像其他语言中的联合体(unions)和变体(variants)。你可以定义一组通用的相关成员作为枚举的一部分,每一组都有不同的一组与它相关的适当类型的数值。

在 Swift 中,枚举类型是一等(first-class)类型。它们采用了很多传统上只被类(class)所支持的特征,例如计算型属性(computed properties),用于提供关于枚举当前值的附加信息, 实例方法(instance methods),用于提供和枚举所代表的值相关联的功能。枚举也可以定义构造函数(initializers)来提供一个初始成员值;可以在原始的实现基础上扩展它们的功能;可以遵守协议(protocols)来提供标准的功能。

欲了解更多相关功能,请参见属性(Properties),方法(Methods),构造过程(Initialization),扩展(Extensions)和协议(Protocols)。

类和结构体

本页包含内容:

类和结构体对比
结构体和枚举是值类型
类是引用类型
类和结构体的选择
集合(collection)类型的赋值与复制行为

类和结构体是人们构建代码所用的一种通用且灵活的构造体。为了在类和结构体中实现各种功能,我们必须要严格按照对于常量,变量以及函数所规定的语法规则来定义属性和添加方法。

与其他编程语言所不同的是,Swift 并不要求你为自定义类和结构去创建独立的接口和实现文件。你所要做的是在一个单一文件中定义一个类或者结构体,系统将会自动生成面向其它代码的外部接口。

注意:
通常一个类的实例被称为对象。然而在Swift 中,类和结构体的关系要比在其他语言中更加的密切,本章中所讨论的大部分功能都可以用在类和结构体上。因此,我们会主要使用实例而不是对象。

属性 (Properties)

本页包含内容:

存储属性(Stored Properties)
计算属性(Computed Properties)
属性监视器(Property Observers)
全局变量和局部变量(Global and Local Variables)
类型属性(Type Properties)

属性将值跟特定的类、结构或枚举关联。存储属性存储常量或变量作为实例的一部分,计算属性计算(而不是存储)一个值。计算属性可以用于类、结构体和枚举里,存储属性只能用于类和结构体。

存储属性和计算属性通常用于特定类型的实例,但是,属性也可以直接用于类型本身,这种属性称为类型属性。

另外,还可以定义属性监视器来监控属性值的变化,以此来触发一个自定义的操作。属性监视器可以添加到自己写的存储属性上,也可以添加到从父类继承的属性上

方法(Methods)

本页包含内容:

实例方法(Instance Methods
类型方法(Type Methods)

方法是与某些特定类型相关联的函数。类、结构体、枚举都可以定义实例方法;实例方法为给定类型的实例封装了具体的任务与功能。类、结构体、枚举也可以定义类型方法;类型方法与类型本身相关联。类型方法与 Objective-C 中的类方法(class methods)相似。

结构体和枚举能够定义方法是 Swift 与 C/Objective-C 的主要区别之一。在 Objective-C 中,类是唯一能定义方法的类型。但在 Swift 中,你不仅能选择是否要定义一个类/结构体/枚举,还能灵活的在你创建的类型(类/结构体/枚举)上定义方法。

添加新评论