关于 Swift
title: 关于 Swift
<div id="Swift 简介">Swift 简介</div>
Swift 是一门开发 iOS, macOS, watchOS 和 tvOS 应用的新语言。即便如此,如果你有 C 或 者 ObjectiveC 开发经验,你会发现 Swift 的有很多你熟悉的内容。
和 C 语言类似,Swift 使用变量来进行存储并通过变量名来关联对应的值。在 Swift 中,不 可变的变量非常常用,它们就是常量,而且比 C 语言的常量更强大。在 Swift 中,如果你要 处理的值不需要改变,那使用常量可以让你的代码更加安全并且更清晰地表达你的意图。
除了我们熟悉的类型,Swift 还增加了 ObjectiveC 中没有的高阶数据类型, 比如元组 Tuples 。元组可以让你创建或者传递一组数据,当函数需要返回单一复合值时,你可以用
一个元组可以返回多个值。
Swift 还增加了 Optional 类型(译者注: Optional类型即可选类型),用于处理值不存在的情 况。可选的意思是 “这里有一个值,并且它等于x ” 或 “这里没有值” 。可选有点像在 ObjectiveC中使用nil ,但是它可以用在任何类型上,不仅仅是类。可选类型比 ObjectiveC 中的 nil 指针更加安全也更具表现力,它是 Swift 许多强大特性的重要组成部 分。
类型安全与行推断
Swift 是一个类型安全(typesafe)
语言。类型安全的语言可以让你清楚地知道代码要处理的值的类型。如果你的代码需要一个 String
,你绝对不可能错误地传进去一个 Int
。 由于Swift是类型安全的,所以它会在编译你的代码时进行类型检查(type checks)
,并
把不匹配的类型标记为错误。这可以让你在开发的时候尽早发现并修复错误。
当你要处理不同类型的值时,类型检查可以帮你避免错误。然而,这并不是说你每次声明常 量和变量的时候都需要显式指定类型。如果你没有显式指定类型,Swift 会使用 类型推断 (type inference)
来选择合适的类型。有了类型推断,编译器可以在编译代码的时候自 动推断出表达式的类型。原理很简单,只要检查你赋的值即可。
因为有了类型推断,和 C 或者 ObjectiveC 比起来 Swift 很少需要声明类型。常量和变量虽 然需要明确类型,但是大部分工作并不要你自己来完成。
当你声明常量或者变量并赋初值的时候类型推断非常有用。当你在声明常量或者变量的时候 赋给它们一个确定值(literal value
或 literal
)即可触发类型推断。(字面量就是会直接出现 在你代码中的值,比如 42
和 3.14159
。)
例如,如果你给一个新常量赋值 42 并且没有标明类型,Swift 可以推断出常量类型是Int ,因为你给它赋的初始值看起来像一个整数:
let meaningOfLife = 42 //meaningOfLife会被推测为 Int 类型
// oc 写法
Int a = 42
同理,如果你没有给浮点数标明类型,Swift 会推断你想要的是 Double
:
let pi = 3.1415926 // pi 会被推断为 Double 类型
当推断浮点数的类型时,Swift 总是会优先选择 Double 而不是 Float 。如果表达式中同时 出现了整数和浮点数,会被推断为 Double 类型:
let anotherPi = 3 + 0.1415926 // anotherPi 会被推测为 Double 类型
<div id="元组">元组</div>
元组是 Swift
中的新类型, 元组 tuples
把多个值组合成一个复合值. 元组的值可以使任意类型的值, 但不要求是相同类型.
下面这个例子中,( 404, "Not Found" )
是一个描述 HTTP 状态码HTTP status code
的元组。HTTP 状态码是当你请求网页的时候 web 服务器返回的一个特定值。如果你请求的网页 不存在就会返回一个 404 Not Found 状态码。
let http404Error = (404, "Not Found") // http404Error 的类型是 (Int, String),值是 (404, "Not Found")
print (http404Error.0) // 404
print (http404Error.1) // "Not Found"
<div id="字符串插值">字符串插值</div>
字符串插值是一种构建新字符串的方式,可以在其中包含常量、变量、字面量和表达式。字符串字面量和多行字符串字面量都可以使用字符串插值。 您插入的字符串字面量的每一项都在以反斜线为前缀的圆括号中:
let multiplier = 3
let message = "\(multiplier) times 2.5 is \(Double(multiplier) * 2.5)"
// message 是 "3 times 2.5 is 7.5"
<div id="可选类型">可选类型</div>
C 和 Objective-C 中并没有可选类型这个概念。最接近的是 Objective-C 中的一个特性,一个方法要不返回一个对象要不返回nil,nil表示“缺少一个合法的对象”。然而,这只对对象起作用——对于结构体,基本的 C 类型或者枚举类型不起作用。对于这些类型,Objective-C 方法一般会返回一个特殊值(比如NSNotFound)来暗示值缺失。这种方法假设方法的调用者知道并记得对特殊值进行判断。然而,Swift 的可选类型可以让你暗示任意类型的值缺失,并不需要一个特殊值。
使用可选类型(optionals)来处理值可能缺失的情况。可选类型表示:
- 有值, 等于 x
- 没有值 为 nil
let possibleNumber = "123"
let convertedNumber = Int(possibleNumber)
// convertedNumber 被推测为类型 "Int?", 或者类型 "optional Int"
Swift 的 nil 和 Objective-C 中的 nil 并不一样。在 Objective-C 中,nil 是一个指向不存在对象的指针。在 Swift 中,nil 不是指针——它是一个确定的值,用来表示值缺失。任何类型的可选状态都可以被设置为 nil,不只是对象类型。