基础部分
Swift 增加了 Objective-C 中没有的高阶数据类型比如元组(Tuple)。元组可以让你创建或者传递一组数据,比如作为函数的返回值时,你可以用一个元组可以返回多个值。
Swift 还增加了可选(Optional)类型,用于处理值缺失的情况。可选表示“那儿有一个值,并且它等于 x ”或者“那儿没有值”。可选有点像在 Objective-C 中使用nil,但是它可以用在任何类型上,不仅仅是类。可选类型比 Objective-C 中的nil指针更加安全也更具表现力,它是 Swift 许多强大特性的重要组成部分。
Swift 是一门类型安全的语言,可选类型就是一个很好的例子。Swift 可以让你清楚地知道值的类型。如果你的代码期望得到一个String,类型安全会阻止你不小心传入一个Int。你可以在开发阶段尽早发现并修正错误。
swift一行代码结束不再需要分号。
swift中字符串不再需要@符号。
输出函数现在是使用print()啦。
swift不会给变量自动赋予初始值。
Swift 的nil和 Objective-C 中的nil不一样。在 Objective-C 中,nil是一个指向不存在对象的指针。在 Swift 中,nil不是指针——它是一个确定的值,用来表示值缺失。任何类型的可选状态都可以被设置为nil,不只是对象类型。
override关键字:类似java的父类方法重载,swift新加入了override关键字。
常量和变量:常量一旦定义就不允许修改,常量在声明的时候就必须要赋值,常量用let声明,变量用var声明。
注:下文中“变量名”都是指的常量名和变量名。
变量类型:可以再变量名后加上类型说明,格式为冒号加类型名。
整数:Swift 提供了8,16,32和64位的有符号和无符号整数类型。
浮点数:float为32位,double位64位。
类型安全和类型推断
由于 Swift 是类型安全的,所以它会在编译你的代码时进行类型检查(type checks),并把不匹配的类型标记为错误。这可以让你在开发的时候尽早发现并修复错误。基于此,和 C 或者 Objective-C 比起来 Swift 很少需要声明类型。常量和变量虽然需要明确类型,但是大部分工作并不需要你自己来完成。
类型别名:使用typealias关键字来定义类型别名, typealias AudioSample = UInt16。
元组:把多个值组合成一个复合值。元组内的值可以是任意类型,并不要求是相同类型:
lethttp404Error = (404,"Not Found")
let(_, statusMessage) = http404Error
print("The status code is\(statusCode)")
或者print("The status code is\(http404Error.0)")来访问
或者lethttp200Status = (statusCode:200, description:"OK")来定义
print("The status code is\(http200Status.statusCode)")来访问。
可选类型:使用可选类型(optionals)来处理值可能缺失的情况。可选类型表示:有值且等有x,或者没有值。声明为Optional只需要在类型后面紧跟一个?即可,一旦声明为Optional的,如果不显式的赋值就会有个默认值nil
错误处理(类似JAVA)
相对于可选中运用值的存在与缺失来表达函数的成功与失败,错误处理可以推断失败的原因,并传播至程序的其他部分;
断言:assert(age >=0,"A person's age cannot be less than zero")
字符串相关
Swift 的String类型与 FoundationNSString类进行了无缝桥接
您可以通过将一个特定字符串分配给一个变量来对其进行修改,或者分配给一个常量来保证其不会被修改:
varvariableString ="Horse"
variableString +=" and carriage"
字符串是值类型,传递参数的时候进行的是值拷贝;
集合类型
Swift 语言中的Arrays、Sets和Dictionaries中存储的数据值类型必须明确。这意味着我们不能把不正确的数据类型插入其中。同时这也说明我们完全可以对取回值的类型非常自信
注意:在我们不需要改变集合的时候创建不可变集合是很好的实践。如此 Swift 编译器可以优化我们创建的集合。
SET:集合(Set)用来存储相同类型并且没有确定顺序的值。当集合元素顺序不重要时或者希望确保每个元素只出现一次时可以使用集合而不是数组
一个类型为了存储在集合中,该类型必须是可哈希化的--也就是说,该类型必须提供一个方法来计算它的哈希值。一个哈希值是Int类型的,相等的对象哈希值必须相同,比如a==b,因此必须a.hashValue == b.hashValue
Swift 的所有基本类型(比如String,Int,Double和Bool)默认都是可哈希化的,可以作为集合的值的类型或者字典的键的类型。没有关联值的枚举成员值(在枚举有讲述)默认也是可哈希化的
注意:
你可以使用你自定义的类型作为集合的值的类型或者是字典的键的类型,但你需要使你的自定义类型符合 Swift 标准库中的Hashable协议。符合Hashable协议的类型需要提供一个类型为Int的可读属性hashValue。由类型的hashValue属性返回的值不需要在同一程序的不同执行周期或者不同程序之间保持相同。
控制流
Repeat-While 相当于do-while
Switch:与 C 语言和 Objective-C 中的switch语句不同,在 Swift 中,当匹配的 case 分支中的代码执行完毕后,程序会终止switch语句,而不会继续执行下一个 case 分支。这也就是说,不需要在 case 分支中显式地使用break语句。这使得switch语句更安全、更易用,也避免了因忘记写break语句而产生的错误;
每一个 case 分支都必须包含至少一条语句
一个 case 可以包含多个模式,用逗号把它们分开
捕获值:
Swift 中,可以捕获值的闭包的最简单形式是嵌套函数,也就是定义在其他函数的函数体内的函数。嵌套函数可以捕获其外部函数所有的参数以及定义的常量和变量:
注意:如果您将闭包赋值给一个类实例的属性,并且该闭包通过访问该实例或其成员而捕获了该实例,您将创建一个在闭包和该实例间的循环强引用。Swift 使用捕获列表来打破这种循环强引用。更多信息,请参考闭包引起的循环强引用。