Swift学习笔记(一)数据类型

环境
Xcode Version 8.3.3 (8E3004b)
Swift version 3.1

参考:Swift 中文手册

1. 可选类型Optional(!, ?)
可选表示 “那儿有一个值,并且它等于 x ” 或者 “那儿没有值” 。
代码
[c]
import UIKit

var optionalInteger: Int?
// 你可以在声明可选变量时使用感叹号(!)替换问号(?)。
// 这样可选变量在使用时就不需要再加一个感叹号(!)来获取值,它会自动解析。
var optionalInteger2: Int!
var optionalString: String?
var optionalIntegerArray: ([Int])?

optionalInteger = 10
optionalInteger2 = 11
optionalString = "Hello Swift!"
optionalIntegerArray = [1,2,3]

print(optionalInteger!) // 需要感叹号来获取值
print(optionalInteger2) // 不需要感叹号
print(optionalString)
print(optionalString!)
print(optionalIntegerArray)
[/c]
输出
[c]
10
11
Optional("Hello Swift!")
Hello Swift!
Optional([1, 2, 3])
[/c]

2. 下划线 (_)
①增强可读性
数值类字面量可以包括额外的格式来增强可读性。整数和浮点数都可以添加额外的零并且包含下划线,并不会影响字面量:
代码
[c]
let paddedDouble = 000123.456
let oneMillion = 1_000_000
let justOverOneMillion = 1_000_000.000_000_1
[/c]

②元组分解忽略内容
你可以将一个元组的内容分解(decompose)成单独的常量和变量,然后你就可以正常使用它们了:
代码
[c]
// http404Error 的类型是 (Int, String),值是 (404, "Not Found")
let http404Error = (404, "Not Found")
let (statusCode, statusMessage) = http404Error
print("The status code is \(statusCode)")
print("The status message is \(statusMessage)")
[/c]
输出
[c]
The status code is 404
The status message is Not Found
[/c]
如果你只需要一部分元组值,分解的时候可以把要忽略的部分用下划线(_)标记:
代码
[c]
let (justTheStatusCode, _) = http404Error
print("The status code is \(justTheStatusCode)")
[/c]
输出
[c]
The status code is 404
[/c]
③替代变量忽略值
[c]
let base = 3
let power = 10
var answer = 1
for _ in 1…power {
answer *= base
}
print("\(base) to the power of \(power) is \(answer)")
// 输出 "3 to the power of 10 is 59049"
[/c]
④匹配所有可能的值
[c]
switch somePoint {
case (0, 0):
print("(0, 0) is at the origin")
case (_, 0):
print("(\(somePoint.0), 0) is on the x-axis")

[/c]
⑤函数忽略参数标签
[c]
func someFunction(_ firstParameterName: Int, secondParameterName: Int) {
// 在函数体内,firstParameterName 和 secondParameterName 代表参数中的第一个和第二个参数值
}
someFunction(1, secondParameterName: 2)
[/c]

3. 区间运算符(a…b)
[c]
let a = 1..<5 // 半闭合区间,表示1到4
let b = 6…10 // 闭合区间,表示6到10
[/c]

4. 空合运算符(a ?? b)
三目运算符a != nil ? a! : b的简短表达方式

5. 字符串插值 \()
[c]
let multiplier = 3
let message = "\(multiplier) times 2.5 is \(Double(multiplier) * 2.5)"
// message 是 "3 times 2.5 is 7.5"
[/c]

6. 可扩展的字型群集
[c]
//两种都表示é
print("\u{e9}")
print("\u{65}\u{301}")
[/c]
第一次听说这种有意思的用法
①影响字符串长度计算
②影响字符串比较,以上两个字符串相等

7. 字符串操作
①字符串访问
字符串索引
属性:startIndex,endIndex
方法:index(before:),index(after:),index(_:offsetBy:)
注意:使用endIndex属性可以获取最后一个Character的后一个位置的索引。因此,endIndex属性不能作为一个字符串的有效下标。
[c]
let greeting = "Guten Tag!"
greeting[greeting.startIndex]
// G
greeting[greeting.index(before: greeting.endIndex)]
// !
greeting[greeting.index(after: greeting.startIndex)]
// u
let index = greeting.index(greeting.startIndex, offsetBy: 7)
greeting[index]
// a
[/c]
②字符串编辑
方法:insert(_:at:),insert(contentsOf:at:)
[c]
var welcome = "hello"
welcome.insert("!", at: welcome.endIndex)
// welcome 变量现在等于 "hello!"

welcome.insert(contentsOf:" there".characters, at: welcome.index(before: welcome.endIndex))
// welcome 变量现在等于 "hello there!"
[/c]
remove(at:),removeSubrange(_:)
[c]
welcome.remove(at: welcome.index(before: welcome.endIndex))
// welcome 现在等于 "hello there"

let range = welcome.index(welcome.endIndex, offsetBy: -6)..<welcome.endIndex
welcome.removeSubrange(range)
// welcome 现在等于 "hello"
[/c]
③字符串比较
操作符:==或!=
方法:hasPrefix(_:)/hasSuffix(_:)

8. 数组类型Array
①数组定义
[c]
var someInts = [Int]()
print("someInts is of type [Int] with \(someInts.count) items.")
// 打印 "someInts is of type [Int] with 0 items."
var threeDoubles = Array(repeating: 0.0, count: 3)
// threeDoubles 是一种 [Double] 数组,等价于 [0.0, 0.0, 0.0]
var anotherThreeDoubles = Array(repeating: 2.5, count: 3)
// anotherThreeDoubles 被推断为 [Double],等价于 [2.5, 2.5, 2.5]
var sixDoubles = threeDoubles + anotherThreeDoubles
// sixDoubles 被推断为 [Double],等价于 [0.0, 0.0, 0.0, 2.5, 2.5, 2.5]
var shoppingList: [String] = ["Eggs", "Milk"]
// shoppingList 已经被构造并且拥有两个初始项。
[/c]
②数组操作
属性:count,isEmpty
方法:append(_:),insert(_:at:),remove(at:),removeLast()
运算符:+=

9. 集合类型Sets
①集合定义
[c]
var letters = Set<Character>()
print("letters is of type Set<Character> with \(letters.count) items.")
// 打印 "letters is of type Set<Character> with 0 items."
var favoriteGenres: Set<String> = ["Rock", "Classical", "Hip hop"]
// favoriteGenres 被构造成含有三个初始值的集合
var favoriteGenres2: Set = ["Rock", "Classical", "Hip hop"]
//该数组字面量中的所有元素类型相同,构造形式可以采用简化的方式代替
[/c]
②集合操作
属性:count,isEmpty
方法:insert(_:),remove(_:),removeAll(),contains(_:)
集合操作
使用intersection(_:)方法根据两个集合中都包含的值创建的一个新的集合。
使用symmetricDifference(_:)方法根据在一个集合中但不在两个集合中的值创建一个新的集合。
使用union(_:)方法根据两个集合的值创建一个新的集合。
使用subtracting(_:)方法根据不在该集合中的值创建一个新的集合。
集合关系
使用“是否相等”运算符(==)来判断两个集合是否包含全部相同的值。
使用isSubset(of:)方法来判断一个集合中的值是否也被包含在另外一个集合中。
使用isSuperset(of:)方法来判断一个集合中包含另一个集合中所有的值。
使用isStrictSubset(of:)或者isStrictSuperset(of:)方法来判断一个集合是否是另外一个集合的子集合或者父集合并且两个集合并不相等。
使用isDisjoint(with:)方法来判断两个集合是否不含有相同的值(是否没有交集)。

10. 字典类型Sets
①字典定义
[c]
var namesOfIntegers = [Int: String]()
// namesOfIntegers 是一个空的 [Int: String] 字典
var airports: [String: String] = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]
// 和数组一样,airports字典也可以用这种简短方式定义
var airports2 = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]
[/c]
②字典操作
属性:count,isEmpty,keys,values
方法:updateValue(_:forKey:),removeValue(forKey:)