let 來(lái)聲明常量,使用 var 來(lái)聲明變量。
常量let 只能賦值1次,變量var 可以多次。不同類型的常量變量運(yùn)算,需要強(qiáng)轉(zhuǎn):
例:
let label = "The width is"
let width = 94
let widthLabel = label + String(width)
強(qiáng)轉(zhuǎn)字符串可以簡(jiǎn)化:加反斜杠括號(hào) \
let apples = 3
let oranges = 5
let appleSummary = "I have \(apples) apples."
let fruitSummary = "I have \(apples + oranges) pieces of fruit."
- 使用 [] 來(lái)創(chuàng)建數(shù)組和字典
var shoppingList = ["catfish", "water", "tulips", "blue paint"]
shoppingList[1] = "bottle of water"
//字符數(shù)組
var occupations = [
"Malcolm": "Captain",
"Kaylee": "Mechanic",
]
occupations["Jayne"] = "Public Relations"
//字典:鍵值對(duì)
let emptyArray = [String]() //空字符數(shù)組
let emptyDictionary = [String: Float]() //空字典
- 使用 if 和 switch 來(lái)進(jìn)行條件操作,使用 for-in 、 for 、 while 和 repeat-while 來(lái)進(jìn)行循環(huán)。
..< 來(lái)表示范圍——半閉半開(kāi)
... 來(lái)表示范圍——閉區(qū)間
//for-in循環(huán)
let individualScores = [75, 43, 103, 87, 12]
var teamScore = 0
for score in individualScores {
if score > 50 {
teamScore += 3
} else {
teamScore += 1
} }
print(teamScore)
var total = 0
for i in 0..<4 {
total += i }
print(total)
//while循環(huán)
var n = 2
while n < 100 {
n=n* 2
}
print(n)
var m = 2
repeat {
m=m* 2
} while m < 100
print(m)
//switch條件
let vegetable = "red pepper"
switch vegetable {
case "celery":
print("Add some raisins and make ants on a log.")
case "cucumber", "watercress":
print("That would make a good tea sandwich.")
case let x where x.hasSuffix("pepper"):
print("Is it a spicy \(x)?")
default:
print("Everything tastes good in soup.")
}
//注:不用加break
- 函數(shù)和閉包:func聲明函數(shù) ->指定返回值類型
func greet(_person: String, day: String) -> String {
return "Hello \(person), today is \(day)."
}
greet(person:"Bob", day: "Tuesday")
//返回值可以有多個(gè)
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)
//參數(shù)可以有多個(gè)
func sumOf(numbers: Int...) -> Int {
var sum = 0
for number in numbers {
sum += number
}
return sum }
sumOf()
sumOf(numbers: 42, 597, 12)
閉包:用 {} 來(lái)創(chuàng)建 一個(gè)匿名閉包。使用 in 將參數(shù)和返回值類型聲明與閉包函數(shù)體進(jìn)行分離。
//閉包
numbers.map({
(number: Int) -> Int in
let result = 3 * number
return result
})
//單個(gè)語(yǔ)句閉包會(huì)把它語(yǔ)句的值當(dāng)做結(jié)果返回
let mappedNumbers = numbers.map({ number in 3 * number })
print(mappedNumbers)
//當(dāng)一個(gè)閉包是傳給函數(shù)的唯一參數(shù),你可以完全忽略括號(hào)。
let sortedNumbers = numbers.sort { $0 > $1 }
print(sortedNumbers)
- 類與對(duì)象
//類
class NamedShape {
var numberOfSides: Int = 0
var name: String
init(name: String) {
self.name = name
}
func simpleDescription() -> String {
return "A shape with \(numberOfSides) sides."
}
}
//子類
class Square: NamedShape {
var sideLength: Double
init(sideLength: Double, name: String) {
self.sideLength = sideLength
super.init(name: name)
numberOfSides = 4
}
func area() -> Double {
return sideLength * sideLength
}
override func simpleDescription() -> String {
return "A square with sides of length \(sideLength)."
}
}
let test = Square(sideLength: 5.2, name: "my test square")
test.area()
test.simpleDescription()
方法、屬性和子腳本)之前加 ? 。如果 ? 之前的值是 nil , ? 后面 的東西都會(huì)被忽略,并且整個(gè)表達(dá)式返回 nil 。否則, ? 之后的東西都會(huì)被運(yùn)行
let optionalSquare: Square? = Square(sideLength: 2.5, name:"optional square")
let sideLength = optionalSquare?.sideLength
- 枚舉和結(jié)構(gòu)體:
//枚舉:
enum Rank: Int {
case Ace = 1
case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten
case Jack, Queen, King
func simpleDescription() -> String {
switch self {
case .Ace:
return "ace"
case .Jack:
return "jack"
case .Queen:
return "queen"
case .King:
return "king"
default:
return String(self.rawValue)
}
}
}
let ace = Rank.Ace
let aceRawValue = ace.rawValue
- 協(xié)議protocol
protocol ExampleProtocol {
var simpleDescription: String { get }
mutating func adjust()
}
//類、枚舉和結(jié)構(gòu)體都可以實(shí)現(xiàn)協(xié)議。
class SimpleClass: ExampleProtocol {
var simpleDescription: String = "A very simple class."
var anotherProperty: Int = 69105
func adjust() {
simpleDescription += " Now 100% adjusted."
}
}
var a = SimpleClass()
a.adjust()
let aDescription = a.simpleDescription
struct SimpleStructure: ExampleProtocol {
var simpleDescription: String = "A simple structure"
mutating func adjust() {
simpleDescription += " (adjusted)"
}
}
var b = SimpleStructure()
b.adjust()
let bDescription = b.simpleDescription
- 錯(cuò)誤處理:采用Error協(xié)議的類型來(lái)表示錯(cuò)誤
enum PrinterError: Error {
case OutOfPaper
case NoToner
case OnFire
}
使用 throw 來(lái)拋出一個(gè)錯(cuò)誤并使用 throws 來(lái)表示一個(gè)可以拋出錯(cuò)誤的函數(shù)。如果在函數(shù)中拋出一個(gè)錯(cuò)誤,這個(gè)函 數(shù)會(huì)立刻返回并且調(diào)用該函數(shù)的代碼會(huì)進(jìn)行錯(cuò)誤處理。
func send(job: Int, toPrinter printerName: String) throws -> String {
if printerName == "Never Has Toner" {
throw PrinterError.noToner
}
return "Job sent"
}
有多種方式可以用來(lái)進(jìn)行錯(cuò)誤處理。一種方式是使用 do-catch 。在 do 代碼塊中,使用 try 來(lái)標(biāo)記可以拋出錯(cuò)誤 的代碼。在 catch 代碼塊中,除非你另外命名,否則錯(cuò)誤會(huì)自動(dòng)命名為 error 。
do {
let printerResponse = try send(job: 1040, toPrinter: "Bi Sheng")
print(printerResponse)
} catch {
print(error)
}
//catch可以使用多個(gè) 來(lái)解決不同的特定的錯(cuò)誤
do {
let printerResponse = try send(job: 1440, toPrinter: "Gutenberg")
print(printerResponse)
} catch PrinterError.onFire {
print("I'll just put this over here, with the rest of the fire.")
} catch let printerError as PrinterError {
print("Printer error: \(printerError).")
} catch {
print(error)
}
使用 defer 代碼塊來(lái)表示在函數(shù)返回前,函數(shù)中最后執(zhí)行的代碼。無(wú)論函數(shù)是否會(huì)拋出錯(cuò)誤,這段代碼都將執(zhí) 行。
var fridgeIsOpen = false
let fridgeContent = ["milk", "eggs", "leftovers"]
func fridgeContains(_ food: String) -> Bool {
fridgeIsOpen = true
defer {
fridgeIsOpen = false
}
let result = fridgeContent.contains(food)
return result
}
fridgeContains("banana")
print(fridgeIsOpen)
- 泛型:尖括號(hào)<>可創(chuàng)建泛型函數(shù)、方法、類、枚舉和結(jié)構(gòu)體
func repeatItem<Item>(repeating item: Item, numberOfTimes: Int) ->[Item] {
var result = [Item]()
for _ in 0..<numberOfTimes {
result.append(item)
}
return result
}
repeatItem(repeating: "knock", numberOfTimes:4)