本文內(nèi)容來(lái)自The Swift Programming Language 中文版
Tips
Swift 并不強(qiáng)制要求你在每條語(yǔ)句的結(jié)尾處使用分號(hào)
變量常量聲明
var myVariable:Int;
myVariable = 13;
let myConstant:Int = 13;
let emptyArray = [String]()
let emptyDictionary = [String: Float]()
控制流
1.使用if
和switch
來(lái)進(jìn)行條件操作,使用for in
、for
、while
和repeat while
來(lái)進(jìn)行循環(huán)
2.swift使用..<
來(lái)表示范圍,..<
的意思是<
,...
的意思是<=
比如
var firstForLoop = 0
for i in 0..<4 {
firstForLoop += i
}
print(firstForLoop)
函數(shù)和閉包
函數(shù):使用func
來(lái)聲明一個(gè)函數(shù),使用名字和參數(shù)來(lái)調(diào)用函數(shù)。使用->
來(lái)指定函數(shù)返回值的類型
普通例子:
func greet(name: String, day: String) -> String {
return "Hello \(name), today is \(day)."
}
greet("Bob", day: "Tuesday")
返回類型為元組
(函數(shù)返回多個(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([5, 3, 100, 3, 9])
print("statistics.sum:\(statistics.sum)")//120
print("statistics.1(max):\(statistics.1)")//100
print("statistics.0(min):\(statistics.0)")//3
函數(shù)可以帶有可變個(gè)數(shù)的參數(shù),這些參數(shù)在函數(shù)內(nèi)表現(xiàn)為數(shù)組的形式:
func sumOf(numbers: Int...) -> Int {
var sum = 0
for number in numbers {
sum += number
}
return sum
}
sumOf()
sumOf(42, 597, 12)
函數(shù)可以作為返回值(return Int -> Int不理解,不是return func?
)
func makeIncrementer() -> (Int -> Int) {
func addOne(number: Int) -> Int {
return 1 + number
}
return addOne
}
var increment = makeIncrementer()
increment(7)
函數(shù)實(shí)際上是一種特殊的閉包:它是一段能之后被調(diào)取的代碼。閉包中的代碼能訪問(wèn)閉包所建作用域中能得到的變量和函數(shù),即使閉包是在一個(gè)不同的作用域被執(zhí)行的 - 你已經(jīng)在嵌套函數(shù)例子中所看到。你可以使用{}來(lái)創(chuàng)建一個(gè)匿名閉包。使用in將參數(shù)和返回值類型聲明與閉包函數(shù)體進(jìn)行分離。
numbers.map({
(number: Int) -> Int in
let result = 3 * number
return result
})
更簡(jiǎn)潔的寫(xiě)法(單個(gè)語(yǔ)句閉包會(huì)把它語(yǔ)句的值當(dāng)做結(jié)果返回)
let mappedNumbers = numbers.map({ number in 3 * number })
print(mappedNumbers)
類(Class)
1.類的聲明
class Shape {
var numberOfSides = 0
func simpleDescription() -> String {
return "A shape with \(numberOfSides) sides."
}
}
2.類的實(shí)例化
var shape = Shape()
shape.numberOfSides = 7
var shapeDescription = shape.simpleDescription()
3.類的構(gòu)造方法
class NamedShape {
var numberOfSides: Int = 0
var name: String
init(name: String) {
self.name = name
}
func simpleDescription() -> String {
return "A shape with \(numberOfSides) sides."
}
}
1.用
self
關(guān)鍵字來(lái)區(qū)別實(shí)例變量
2.如果你需要在刪除對(duì)象之前進(jìn)行一些清理工作,使用deinit
創(chuàng)建一個(gè)析構(gòu)函數(shù)
子類的定義方法是在它們的類名后面加上父類的名字,用冒號(hào)分割,比如
class Square: NamedShape
子類如果要重寫(xiě)父類的方法的話,需要用override
標(biāo)記
4.類屬性的getter
跟setter
class EquilateralTriangle: NamedShape {
var sideLength: Double = 0.0
init(sideLength: Double, name: String) {
self.sideLength = sideLength
super.init(name: name)
numberOfSides = 3
}
var perimeter: Double {
get {
return 3.0 * sideLength
}
set {
sideLength = newValue / 3.0
}
}
override func simpleDescription() -> String {
return "An equilateral triagle with sides of length \(sideLength)."
}
}
var triangle = EquilateralTriangle(sideLength: 3.1, name: "a triangle")
print(triangle.perimeter)
triangle.perimeter = 9.9
print(triangle.sideLength)
在perimeter的
setter
中,新值的名字是newValue
。你可以在set
之后顯式的設(shè)置一個(gè)名字,諸如set(_perimeter:Double) { sideLength = newValue / 3.0}
枚舉跟結(jié)構(gòu)體
1.初始化枚舉
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
print(ace)//Ace
let aceRawValue = ace.rawValue
print(aceRawValue)//1
let aceDescription = ace.simpleDescription()
print(aceDescription)//ace
2.使用struct來(lái)創(chuàng)建一個(gè)結(jié)構(gòu)體。結(jié)構(gòu)體和類有很多相同的地方,比如方法和構(gòu)造器。它們之間最大的一個(gè)區(qū)別就是結(jié)構(gòu)體是傳值,類是傳引用
struct Card {
var rank: Rank
var suit: Suit
func simpleDescription() -> String {
return "The \(rank.simpleDescription()) of \(suit.simpleDescription())"
}
}
//.Three代表的是 Rank.Three Spades代表的是 Suit.Spades
let threeOfSpades = Card(rank: .Three, suit: .Spades)
let threeOfSpadesDescription = threeOfSpades.simpleDescription()
協(xié)議和擴(kuò)展
1.使用protocol
來(lái)聲明一個(gè)協(xié)議
protocol ExampleProtocol {
var simpleDescription: String { get }
mutating func adjust()
}
2.類、枚舉和結(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
3.使用extension來(lái)為現(xiàn)有的類型添加功能
extension Int: ExampleProtocol {
var simpleDescription: String {
return "The number \(self)"
}
mutating func adjust() {
self += 42
}
}
print(7.simpleDescription)//The number 7