The Swift Programming Language 2.0中文版閱讀筆記
[TOC]
- 為了方便自己遇到基礎問題時可以查詢,寫的并不詳細,并且會將自己不懂的打上問號慢慢來解決
第一章 歡迎使用Swift
- Swift可以兼容OC代碼,并且支持過程式編程和面向對象的編程
- 混編會造成App體積增大
簡單值
- let聲明常量,var聲明變量
常量在編譯的時候并不需要明確的值,只能夠賦值一次
- swift不用明確聲明類型,編譯器會自動推斷類型
當沒有初始值時必須確定類型
- 如果初始值沒有提供足夠的信息或者沒有初始值,我需要在變量后面申明類型,用冒號來分隔
let explicitDouble: Double = 70
print(explicitDouble) // 打印結果70.0\n,print可以自動換行
- 值永遠不會被隱式轉換為其他類型,所以我們必須顯示轉換,有兩種方式
比方說在OC中整數自然會向浮點數看,而在swift中會整數與浮點數做運算會直接報錯
- 類型加上()
- \加上()
- 使用方括號[]創建數組和字典,并使用下標或者鍵(key)來訪問元素,最后一個元素允許有逗號
let emptyArray = [String]()
let emptDictionary = [String: Float]()
控制流(條件判斷和循環)
- 使用if和switch來進行條件操作,使用for-in,for,while和repeat-while進行循環.包裹條件和循環變量括號可以省略,但是語句體的大括號是必須的
- if語句中,條件必須是一個布爾表達式,這意味著像if score{...}這樣的代碼將報錯,而不會隱形第與0做對比
不會像OC一樣直接判斷某個值是否存在,必須要有大于小于之類的
- 可以使用if和let來處理值缺失的情況,這些值可由可選值來代表.一個可選的值是一個具體的值或者是nil以表示值缺失,在類型后面加一個問號?標記這個變量的值是可選的
在類型后面加了一個問號就是說這個值可以是可空類型,不然swift不會自動給變量賦值.但是一樣不可以直接使用if判斷值是否存在
var optionalName: String? = nil
var greeting = "Hello!"
if let name = optionalName {
greeting = "Hello, \(name)"
} else {
greeting = "可以嘗試去掉let"
}
- 也可以使用??來提供一個默認值,如果可選值為空,那么就會時候??后面的默認值,有點類似于三目運算符
- switch支持任意類型的數據以及各種比較操作,不僅是整數以及測試相等;
- for-in遍歷字典需要兩個變量來表示鍵值對,(a, b),字典是一個無序集合,所以他們的建和值以任意順序迭代結束
- 在循環中使用..<來表示范圍,如果包含上界要使用...,也可以使用傳統的寫法
函數和閉包
- func聲明函數,->來指定函數返回值的類型
func greet(name: String, day: String) -> String {
return "Hello \(name), today is \(day)"
}
greet("Bob", day: "Tuesday")
- 使用元組(參數是元組)來是函數返回多個值(值是也是多個),函數也可以帶有可變個數(變現為數組形式)的參數
元組(Tuples)有點類似于數組,但是要把方括號改成圓括號,并且可以放任意類型的值,還可以給元祖中的元素命名
func calculateStatistics(scores: [Int], str: String) -> (min: Int, max: Int, sum: Int) {
var min = scores[0]
var max = scores[0]
var sum = 0
for score in scores {
if score > max {
max = score
} else if score < min {
min = score }
sum += score }
return (min, max, sum)
}
let statistics = calculateStatistics([5, 3, 100, 3, 9], str: "str只是打醬油說明元組的任意參數和命名")
print(statistics.sum)
print(statistics.2)
- 函數是一等類型,函數可以嵌套,嵌套的di函數可以訪問外側函數的變量,函數也可以作為另一個函數的返回值,也可以作為參數
- 可以使用{}創建匿名閉包,使用in將參數和返回值類型聲明與閉包函數體進行分離
var numbers = [20, 19, 7, 12]
//numbers.map({
// (number: Int) -> Int in
// let result = 3 * number
// return result
//})
// 和下面的閉包一樣
// 有很多種創建更簡潔的閉包的方法。如果一個閉包的類型已知,比如作為一個回調函數,你可以忽略參數的類型
// 和返回值。單個語句閉包會把它語句的值當做結果返回。
let mappedNumbers = numbers.map({ number in 3 * number })
print(mappedNumbers)
// 短閉包中可以通過參數位置而不是參數名字來引用參數,當閉包做為傳入函數的唯一參數可以忽略括號
// $0與$1代表的是第一個參數和第二個參數
let sortedNumbers = numbers.sort { $0 > $1 }
print(sortedNumbers)