文章目錄:
(1)簡單值
(2)控制流
(3)函數和閉包
(1)簡單值
- 使用let來聲明常量,使用var來聲明變量。常量為它賦值一次然后就永遠改變不了了,而變量可以無限修改(好像是廢話)
- 定義常量或者變量時,是否聲明類型都是可以的,系統可以自動推斷類型
- 字符串拼接可以直接+。eg:
let label = "The width is"
let width = 94
let widthLabel = label + String(width)
- 通過上面代碼可以看到將一個數值轉換成了字符串類型,數值轉字符串有以下兩種方式:
1.見上面代碼,將數值寫在括號中,前面加String。
2.把值寫到括號中,并且在括號之前寫一個反斜杠。
- 在OC中數組是[],字典是{},但是在swift中,數組和字典都是用的[],訪問方式還是和以前一樣,通過下標或者key訪問。在swift中,最后一個元素后面允許有個逗號。
var shoppingList = ["catfish", "water", "tulips", "blue paint"]
shoppingList[1] = "bottle of water"
var occupations = [
"Malcolm": "Captain",
"Kaylee": "Mechanic",
]
occupations["Jayne"] = "Public Relations"
要創建一個空數組或者字典,使用初始化語法。
let emptyArray = [String]()
let emptyDictionary = [String: Float]()
(2)控制流
1.
在 if 語句中,條件必須是一個布爾表達式——這意味著像 if score { ... } 這樣的代碼將報錯,而不會隱形地 與 0 做對比。
我們可以一起使用 if 和 let 來處理值缺失的情況。這些值可由可選值來代表。一個可選的值是一個具體的值或者 是 nil 以表示值缺失。在類型后面加一個問號來標記這個變量的值是可選的。
var optionalString: String? = "Hello"
print(optionalString == nil)
var optionalName: String? = "John Appleseed"
var greeting = "Hello!"
if let name = optionalName {
greeting = "Hello, \(name)"
}
如果變量的可選值是nil ,條件會判斷為 false,大括號中的代碼會被跳過。如果不是 nil,會將值解包并賦給 let 后面的常量,這樣代碼塊中就可以使用這個值了。
另一種處理可選值的方法是通過使用 ?? 操作符來提供一個默認值。如果可選值缺失的話,可以使用默認值來代替。
let nickName: String? = nil
let fullName: String = "John Appleseed"
let informalGreeting = "Hi \(nickName ?? fullName)"
這個 ?? 我覺得和三目運算符有點類似,如果 ?? 前面的值存在,則使用 ?? 前面的值,否則使用 ?? 后面的值。
2. for in 循環
使用 ..< 創建的范圍不包含上界,如果想包含的話需要使用 ...
var total = 0
for i in 0..<4 {
total += i
}
print(total)
(3)函數和閉包
- 使用 func 來聲明一個函數,使用名字和參數來調用函數。使用 -> 來指定函數返回值的類型。
func greet(person: String, day: String) -> String {
return "Hello \(person), today is \(day)."
}
greet(person:"Bob", day: "Tuesday")
- 默認情況下,函數使用它們的參數名稱作為它們參數的標簽,在參數名稱前可以自定義參數標簽,或者使用 _ 表示不使用參數標簽。
func greet(_ person: String, on day: String) -> String {
return "Hello \(person), today is \(day)."
}
greet("John", on: "Wednesday")
- 使用元組來讓一個函數返回多個值。
func calculateStatistics(scores: [Int]) -> (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(scores:[5, 3, 100, 3, 9])
print(statistics.sum)
print(statistics.2)
- 函數可以帶有可變個數的參數,這些參數在函數內表現為數組的形式:
func sumOf(numbers: Int...) -> Int {
var sum = 0
for number in numbers {
sum += number
}
return sum }
sumOf()
sumOf(numbers: 42, 597, 12)
- 函數可以嵌套。被嵌套的函數可以訪問外側函數的變量,可以使用嵌套函數來重構一個太長或者太復雜的函數。(我覺得沒有什么必要)
func returnFifteen() -> Int {
var y = 10
func add() {
y += 5
}
add()
return y
}
returnFifteen()
- 函數是第一等類型,這意味著函數可以作為另一個函數的返回值。
func makeIncrementer() -> ((Int) -> Int) {
func addOne(number: Int) -> Int {
return 1 + number
}
return addOne
}
var increment = makeIncrementer()
increment(7)
- 函數也可以當做參數傳入另一個函數。
func hasAnyMatches(list: [Int], condition: (Int) -> Bool) -> Bool {
for item in list {
if condition(item) {
return true
} }
return false
}
func lessThanTen(number: Int) -> Bool {
return number < 10
}
var numbers = [20, 19, 7, 12]
hasAnyMatches(list: numbers, condition: lessThanTen)
- 函數實際上是一種特殊的閉包:它是一段能之后被調取的代碼。閉包中的代碼能訪問閉包所建作用域中能得到的變 量和函數,即使閉包是在一個不同的作用域被執行的 - 你已經在嵌套函數例子中所看到。你可以使用 {} 來創建 一個匿名閉包。使用 in 將參數和返回值類型聲明與閉包函數體進行分離。(閉包,看起來真是一臉懵逼啊,得好好研究研究,看到下面的代碼,我就在想寫翻譯文檔的人絕對是寫Java的??)
numbers.map({
(number: Int) -> Int in
let result = 3 * number
return result
})
- 有很多種創建更簡潔的閉包的方法。如果一個閉包的類型已知,比如作為一個回調函數,你可以忽略參數的類型和返回值。單個語句閉包會把它語句的值當做結果返回。
let mappedNumbers = numbers.map({ number in 3 * number })
print(mappedNumbers)
- 可以通過參數位置而不是參數名字來引用參數——這個方法在非常短的閉包中非常有用。當一個閉包作為最后一個參數傳給一個函數的時候,它可以直接跟在括號后面。當一個閉包是傳給函數的唯一參數,可以完全忽略
括號。
let sortedNumbers = numbers.sort { $0 > $1 }
print(sortedNumbers)