Stories

Detail Return Return

Swift 個人學習筆記 - 01: A Swift Tour - Stories Detail

幾個無法分類的知識:1 - Swift 不需要 main()函數,全局的第一段代碼就是程序的入口。(存疑)2 - Swift 中沒有像 C 裏面一樣,非常明確地區別“聲明”和“定義”的概念,全部的定義都是 “聲明 + 定義”。
圖片
變量和常量聲明變量和常量let aConstant = 42
let aConstantDouble : Double = 70 // 個人推薦這樣根據後面的值假定常量的類型。第一個例子裏面,常量的類型就被設置成了Int。而第二個例子裏面,雖然初始化值給的是一個Int,但是前面顯式地説明了這是一個Double類型變量,所以這就是一個 Double 類型。變量使用的是var。數組在 Swift 裏面,數組和關聯數組成為了基本數據類型(在 Objective-C 裏面是類),這大大簡化了數據操作。聲明方式如下:var shoppingList = ["catfish", "water", "popcorn"]
var shoppingList = [String]()其中第一行是定義+初始值。第二行則不賦予初始值關聯數組(Dictionary)var aDict = [:]
var aDict = [String:Float]() // 推薦
var aListOfSalaries = [

"Andrew": 10000.0,
"Bob": 15000.0

]上面第二種方法是詳細的定義,具體限制了關聯數組的 key 和 value 的類型。
圖片
控制流基本上和 C 差不多,但不需要括號。不過有{}。條件操作有:if、switch循環操作有:for-in,for,while,repeat-while(不是 “do-while”)。注意:if的條件不循序用一個普通變量的值作為判斷條件體了,只能布爾判斷值。比如 “if some_value” 就是不合法的寫法。Optional 變量如果聲明變量的時候加入?,那麼變量就是可選的(optional)此時,變量可以置為 nil 值。猜測這個方法就是相當於 C 裏面的指針或者是其他方法中的引用(不確定)。Arrar 和 Dictionary 中的 for-infor number in someArray {

...

}

for (kind, number) in someDictionary {

...

}上面是使用 “for-in” 語法來 access array 和 dict 的方法。當然,array 和 dict 也可以嵌套。循環while n < 200 { ... }

repeat { ... } while m < 100

for i in 0..<4 { } // 表示 [0,4)
for i in 0...4 { } // 表示 [0,4]
圖片
函數和簇(閉包)使用 func 來聲明和定義函數:func greeting (persion: String, day: String) -> String {

...

}可以使用 “元組”(tuple)來創建僅在該函數中使用的複合值(類似 struct):func calculate (scores:[Int]) -> (min: Int, max: Int, sum: Int) {

...

}此外,可以把函數作為值返回:func theFunc(number: Int) -> Int { ... }

func retuanAFunc() -> (Int -> Int) {

return theFunc

}函數可以內嵌,內嵌的函數可以訪問外部的變量:func someFunc() -> Int {

var error: Int = 0
...
func checkError() {
    if (...) { error = -1 }
}
...
return error

}
圖片
對象和類使用關鍵字 class 加花括號來構建一個類。與前面其他格式中花括號的作用一眼,都只是用來作為作用域。var anInstance = aClass // 很像 C++使用點語法來訪問類中的成員與方法。初始化函數:init,接近 Objective-C 中的 init反初始化函數:deinit,接近 Objective-C 中的 dealloc成員函數重載:在 func 前面加上 override 關鍵字。getter / setter聲明成員時,額外可以聲明 getter / setter:class SomeClass : FatherClass {

var radius : Int
init (radius : Int) {
    super.init (radius)
    self.radius = radius
}

var circle : Double {
    get {
        ...
    }
    set {
        ...        // setter的參數如果未定義的話,默認叫做 `newValue`。也可以顯式地定義。
    }
}

}willset 和 didSet有時候,如果不需要自行實現 set / get操作,但需要在值更新前後操作的話,可以針對該值定義 willSet 和 didSet 函數:var squre : Double {

willSet: {
    ...
}

}
圖片
枚舉和結構體這其實是我最搞不懂的元素之一了,目測我以後只會用最基礎的部分。使用 enum 創建枚舉。enum 可以包括函數:enum PokerFace {

case ace = 1            // 注意這裏如果不賦初始值的話,默認是 1
case two, three, four, five, six, seven, eight, nine, ten
case jack, queen, king
func decription() -> String {
    switch self {
        case .ace:
            return "ace"
        case .jack:
            return "jack"
        case .queen:
            return "queen"
        case .king:
            return "king"
        default:
        return String (self.rawValue)        // Note
    }
}

}注意隱含的 rawValue 值。可以用構造函數創建一個 enum 的實例:let aRank = Rank (rawValue : 3)
let aRank = Rank (.three)使用 struct 定義結構體:struct Card_st {

var rank : Rank
var suit : Suit
func simpleDescription () -> String {
    return ...
}

}struct 的行為與 class 很類似,但傳遞時,struct 傳遞的是拷貝,而 class 傳遞的是引用struct 也有 initializer
圖片
協議和擴展協議protocol ExampleProtocol {

var simpleDescription: String {get}
mutating func adjust ()

}聲明部分的兩行分別代表一下意思:有一個針對 simpleDescritpion 的 String 的 getter聲明一個函數:其中 mutating 關鍵字用在 struct 中,表示可以修改 struct 的內容。class、struct 和 enum 都可以有協議。聲明一個類,表示符合某個協議,在冒號後面加就好了:class SomeClass : ExampleProtocol {

...

}擴展extansion Int: ExampleExtansion {

...

}上面表示為 Int 類型添加一個名為 “ExampleExtension” 的擴展。此時你可以創建一個叫做 “ExampleProtocol” 的 Int 變量,這個時候, “ExampleExtension” 的語義就變成了 “添加了 ExampleExtension 擴展的 Int 類型”。這是的基本類型也好像類一樣繼承了。
圖片
錯誤處理使用遵循 Error 協議的類型來表示錯誤,比如:enum ExampleError : Error {

case outOfPaper
case noToner
case onFire

}使用 throw 來拋出錯誤。使用 throws 標記可以拋出錯誤的函數:func send (job : Int, toPrinter printerName : String) throws -> String {

...
if printerName == ... {
    throw ExampleError.noToner
}
return "..."

}錯誤處理方法1:do-catchdo {

...

} catch {

print(error)        // 這個貌似是隱含的數據類型?不確定

}錯誤處理方法2:do + 多個catchdo {

...

} catch PrinterError.onFire {

...

} catch let printerError as PrinterError {

print ("Printer error: \(printerError).")

} catch {

print(error)

}錯誤處理方法3:try?

user avatar danshendesongshu Avatar echeverra Avatar
Favorites 2 users favorite the story!
Favorites

Add a new Comments

Some HTML is okay.