Swift(一) 基础部分

基础部分

基本数据类型

Swift 包含C和OC 上的所有基础数据类型 Int Double Float Bool String

还提供了3个基本集合类型 Array Set Dictionary

字符串和字符

1
2
3
var variableString = "Horse"
variableString += " and carriage"
// variableString 现在为 "Horse and carriage"

字符串插值 (String Interpolation)

1
2
3
let multiplier = 3
let message = "\(multiplier) times 2.5 is \(Double(multiplier) * 2.5)"
// message is "3 times 2.5 is 7.5"

字符串索引

每一个String值都有一个关联的索引(index)类型,String.Index,它对应着字符串中的每一个Character的位置。

不同的字符可能会占用不同数量的内存空间,所以要知道Character的确定位置,就必须从String开头遍历每一个 Unicode 标量直到结尾。因此,Swift 的字符串不能用整数(integer)做索引。

1
2
3
4
5
6
7
8
9
10
let greeting = "Guten Tag!"
greeting[greeting.startIndex]
// G
greeting[greeting.endIndex.predecessor()]
// !
greeting[greeting.startIndex.successor()]
// u
let index = greeting.startIndex.advancedBy(7)
greeting[index]
// a

高阶数据类型 元组

定义

元组(tuples)把多个值组合成一个复合值。元组内的值可以是任意类型,并不要求是相同类型。

let people = ("xiaoMing", 22)

1
2
3
4
5
6
7
8
9
10
func doSomeMightCauseError() -> (Bool, NSError?) {

if success {
return (true, nil)
}
else {

return (false, NSError(domain: "", code: 1, userInfo: nil))
}
}

常量、变量

常量声明 let max = 10

变量声明 var variable = 10

类型标注 var welcomeMessage: String

类型安全和类型推断

由于 Swift 是类型安全的,所以它会在编译你的代码时进行类型检查(type checks),并把不匹配的类型标记为错误。这可以让你在开发的时候尽早发现并修复错误

let a = 100 a 被推断为Int

可选类型 (optionals)

使用可选类型(optionals)来处理值可能缺失的情况。

有值等于 X 或者没有值等于 nil

var optionalVar: String? = "123"

关于nil

Swift 的nil和 Objective-C 中的nil并不一样。在 Objective-C 中,nil是一个指向不存在对象的指针。在 Swift 中,nil不是指针——它是一个确定的值,用来表示值缺失。任何类型的可选状态都可以被设置为nil,不只是对象类型。

强制解析

使用if语句和nil比较来判断一个可选值是否包含值。

当确定可选类型确实包含值之后,在变量名后加一个! 来获取值。表示确定这个可选值有值。

使用!来获取一个不存在的可选值会导致运行时错误。使用!来强制解析值之前,一定要确定可选包含一个非nil的值。

1
2
3
if optionalVar != nil {
print(optionalVar!)
}

可选绑定

使用可选绑定(optional binding)来判断可选类型是否包含值,如果包含就把值赋给一个临时常量或者变量。

1
2
3
4
if let a = optionalVar {

print(a)
}

隐式解析可选类型

有时候在程序架构中,第一次被赋值之后,可以确定一个可选类型_总会_有值。在这种情况下,每次都要判断和解析可选值是非常低效的,因为可以确定它总会有值。

1
2
3
4
5
6
7
8
//可选类型`String`
let possibleString: String? = "An optional string."
let forcedString: String = possibleString! // 需要惊叹号来获取值

//隐式解析可选类型

let assumedString: String! = "An implicitly unwrapped optional string."
let implicitString: String = assumedString // 不需要感叹号