Swift 語言學習及速查手冊

2021-03-02 代碼隨想

學習一門新的程式語言要多久?答案是隨著你的經驗的增加,學習花費的時間越來越短。當然,這也和新語言的不斷演變進化有關係。

我利用周末兩天時間,把《Swift Programming Language》中文版整整的細看了一遍,然後為了總結提取 Swift 的主要語言特性,又把這本書快速過了第二遍。

根據我的番茄鍾粗略統計,我看書學習第一遍大約花了 5 小時(包括邊學,邊在 XCode 試驗的時間),第二遍主要是快速過一遍主要特性,將主要示例代碼提取出來,大約花了 3.5 小時。

連我自己都覺得有點難以置信,總共只需要 8 小時,就可以基本入門一門新語言了。

很多時候,我們想學習某個東西,但是卻一直停留在想一想的狀態,遲遲都未動手。究其原因,大概是如下幾個原因吧:

恐懼未知。對未知的東西沒有把握,怕太難,怕需要太長時間學,所以能拖就拖。

注意力不能集中。連續玩幾個小時遊戲一點不累,看半小時書就感覺身心俱疲。

番茄工作法在這個時候就起作用了,告訴自己,不想太多,開始一個番茄鍾試試,在這 25 分鐘內,只關注這 25 分鐘內要看的內容。然後,很自然的,障礙被逐個擊破,番茄鍾一個接著一個。

以下是我學習 Swift 的代碼總結,可用於之後速查。

代碼: https://github.com/coderzh/CodeTips/blob/master/swift.swift

/* swift.swift: Swift 速學速查速用代碼手冊 Source: github.com/coderzh/CodeTips/blob/master/swift.swift Author: coderzh(github.com/coderzh) Blog: http://blog.coderzh.com 參考:《Swift Programming Language》 */import Cocoa// 0. 注釋/*塊注釋行尾分號可不用*/// 1. Hello Worldprint("Hello Swift")// 2. 常量變量類型let constValue = 3.14var variable = 18variable += 1// 指定類型let age: Int = 18// 多重賦值var (a, b) = (1, 2)// 匿名佔位符(_, b) = (3, 4)// 類型會自動推導let name = "It's a string"let gravity = 0.98 // 默認 double// 永遠不做隱式轉換,必須自己強轉let sum = Double(age) + gravity// 運算:+, -, *, /, % 求餘// 比較:<, >, ==, >=, <=, !=// === 恆等,是否為同一個對象// !== 不恆等// 位運算:~x 取反,& 與,| 或,^ 異或,<< 左移動,>> 右移// 溢出運算符 &+ &- &* &/ &% ,這樣溢出部分就會丟掉,不會出錯,比如:var willOverflow = UInt8.maxwillOverflow = willOverflow &+ 1 // = 0// 類型let b1 = truelet i32: Int32 = 6let f64: Float64 = 3.1415// 字符串let str = "swift"// 字符串連接,使用\()var hello = "hello \(str)"let count = str.characters.countlet c = hello[hello.startIndex]for i in hello.characters.indices {    print("\(hello[i])")}hello.insert("!", atIndex: hello.endIndex)hello.insertContentsOf(" there".characters, at: hello.endIndex.predecessor())hello.removeAtIndex(hello.endIndex.predecessor())hello.hasPrefix("hello")hello.hasSuffix("swift")let unicode = "你好 swift"unicode.characters.count // 8for codeUnit in unicode.utf8 {    print("\(codeUnit)", terminator: "")}if hello == unicode{}// 數組var shoppingList = ["test", "book", "bike"]shoppingList[2] = "joke"shoppingList.append("bus")shoppingList.insert("foo", atIndex: 0)shoppingList.removeAtIndex(0)// 類似 sliceshoppingList[0..<2] // ["test", "book"]shoppingList[0...2] // ["test", "book", "joke"]for item in shoppingList {    print(item)}for (index, value) in shoppingList.enumerate() {    print("\(index): \(value)")}let emptyArray = [String]()var someInts = [Int]()var someInts2 = [Int](count: 3, repeatedValue: 8) // [8, 8, 8]var someInts3 = [Int](count: 3, repeatedValue: 2)// 任意類型數組var anyArray = [Any]()anyArray.append(1)anyArray.append("book")someInts = someInts2 + someInts3 // [8, 8, 8, 2, 2, 2]// 元組let httpResponse = (404, "Not Found")print(httpResponse.0)// 集合 Setsvar setBooks: Set<String> = ["book1", "book2"]// 自動推導var setBooks2: Set = ["book1", "book2", "book3"]setBooks.intersect(setBooks2)  // 交集setBooks.exclusiveOr(setBooks2)  // 非交集setBooks.union(setBooks2)  // 併集setBooks.subtract(setBooks2)  // 減集setBooks.isSubsetOf(setBooks2)setBooks2.isSupersetOf(setBooks)setBooks.isStrictSubsetOf(setBooks2)  // 被包含且不相等// 字典var map = [    "Malcolm": "hehe",    "Keylee": 123,]map["Keylee"] = 166var namesOfInt = [Int: String]()namesOfInt[10] = "ten"if let oldValue = namesOfInt.updateValue("Ten", forKey: 10) {    print("\(oldValue)")}if let name = namesOfInt[8] {    print("\(name)")} else {    print("not exist 8")}for (intKey, strValue) in namesOfInt {    print("\(intKey):\(strValue)")}// namsOfInt.valuesfor intKeys in namesOfInt.keys {}let intKeys = [Int](namesOfInt.keys)// 可空變量,用 ?var optionalString: String? = nilif let name = optionalString {    print("hello \(name)")}// 3. 流程控制// 循環// [0, 4)for i in 0..<4 {    print("print \(i)")  // 4 times}// [0, 4]for i in 0...4 {    print("print \(i)")  // 5 times}var i = 0while i < 2 {    print("\(i)")    i += 1}repeat {    print("\(i)")    i += 1} while i < 5// 判斷if i < 5 {} else if i < 10 {} else {}// 強大的 switch// 不需要 breakswitch i {case 1, 2, 3:    print("123")case 5:    print("5")case 6..<10:    print("6-9")default:    print("default")}let somePoint = (1, 1)switch somePoint {case (0, 0):    print("0, 0")case (_, 1):    print("y is 1")case (-2...2, -2...2): // 區間    print("from (-2,-2) to (2, 2)")case (let x, 0):  // 值綁定    print("\(x)")case let (x, y) where x == y:  // where    print("x == y")case (10, 11):    fallthrough  // 貫穿,繼續向下default:    print("default")}// 控制轉移// continue break fallthrough retrun throw// 帶標籤i = 0gameLoop: while i > -1 {    i = i + 1    if i > 3 {        break gameLoop    }}// 提前退出(提前返回)func greet(person: [String:String]) {    guard let name = person["name"] else {        return    }    print("\(name)")}greet(["age":"18"])// 4. 函數func greet(name: String, day: String) {    print("Hello \(name), today is \(day)")}// 第二個參數默認需要指定名稱greet("tom", day: "2016")func sum(a: Int, b: Int) -> Int {    return a + b}sum(1, b: 2)// 多重返回值func minMax(array: [Int]) -> (min: Int, max: Int) {    // ...    return (0, 1)}// 可選返回值加 ?func minMax2(array: [Int]) -> (min: Int, max: Int)? {    if array.isEmpty { return nil }    return (0, 1)}// 指定外部參數名func sayHello(to person: String, and anotherPerson: String) {    print("Hello \(person) and \(anotherPerson)")}sayHello(to: "coderzh", and: "tom")// 忽略外部參數名,使用 _func sayHello2(person: String, _ anotherPerson: String) {    print("Hello \(person) and \(anotherPerson)")}sayHello2("coderzh", "jack")// 默認參數func someFunction(p: Int = 10) {    print("\(p)")}someFunction()// 可變參數func sum(numbers: Int...) -> Int {    var total = 0    for n in numbers {        total += n    }    return total}sum(1, 2, 3, 4, 5)// 參數默認是常量類型,如需指定變量類型,前面加 var(swift 3 將移除 var)func alignRight(var string: String, totalLength: Int, pad: Character) -> String {    string = string + "!"    return string}// 傳入傳出參數 inoutfunc swap(inout a: Int, inout _ b: Int) {    let temp = a    a = b    b = temp}var someInt = 7var anotherInt = 8// inout 參數必須加 &swap(&someInt, &anotherInt)// 函數類型,函數變量var sumFunc: (Int, Int) -> Int = sumsumFunc(1, 2)// 函數可做參數func doSum(handler:(Int, Int) -> Int, _ a: Int, _ b: Int) {    handler(a, b)}// 函數可做返回值func getSum() -> (Int, Int) -> Int {    // 函數可嵌套    func someFunc(a: Int, b: Int) -> Int { return a + b }    return someFunc}doSum(sum, 2, 3)// 閉包// 閉包是引用類型let reversed2 = shoppingList.sort({a, b in a < b})let r = shoppingList.sort({ $0 < $1 })let r2 = shoppingList.sort(<)let r3 = shoppingList.sort{ $0 < $1 }// 非逃逸閉包(noescape closure)// 閉包只能在函數內執行,不能「逃逸」出去func someClosure(@noescape closure: () -> Void) {    closure()}// 自動閉包(這樣不用寫花括號了?)func autoClosure(@autoclosure provider: () -> String) {    provider()}autoClosure(shoppingList.removeAtIndex(0))// 5. 枚舉(一等公民,十分強大)// 值類型enum Rank: Int {    case Ace = 1    case Two, Three}var ace = Rank.Ace  // AceRank.Ace.rawValue  // 1let ace1 = Rank(rawValue: 1)  // Aceace = .Twoenum ServerResponse {    case Result(String, String)    case Error(String)}// 可失敗構造器enum TemperatureUnit {    case Kelvin, Celsius, Fahrenheit    init?(symbol: Character) {        switch symbol {        case "K":            self = .Kelvin        case "C":            self = .Celsius        case "F":            self = .Fahrenheit        default:            return nil        }    }}let success = ServerResponse.Result("6:00am", "6:00pm")let failure = ServerResponse.Error("Out of cheese")switch success {case let .Result(sunrise, sunset):    let serverResponse = "sunrise at \(sunrise), sunset at \(sunset)"case let .Error(error):    let serverResponse = "Error \(error)"}// 枚舉遞歸...enum ArithmeticExpression {    case Number(Int)    indirect case Addition(ArithmeticExpression, ArithmeticExpression)    indirect case Multiplication(ArithmeticExpression, ArithmeticExpression)}func evaluate(expression: ArithmeticExpression) -> Int {    switch expression {    case .Number(let value):        return value    case .Addition(let left, let right):        return evaluate(left) + evaluate(right)    case .Multiplication(let left, let right):        return evaluate(left) * evaluate(right)    }}// 計算 (5 + 4) * 2let five = ArithmeticExpression.Number(5)let four = ArithmeticExpression.Number(4)let sum2 = ArithmeticExpression.Addition(five, four)let product = ArithmeticExpression.Multiplication(sum2, ArithmeticExpression.Number(2))print(evaluate(product)) // 輸出 "18」// 6. 類和結構體// 結構體是值類型,類是引用類型class SomeClass {    var width = 0    var height = 0    // class 不需要 mutating    func incrementWidth() {        self.width += 1    }    // 下標操作: [n]    subscript(index: Int) -> Int {        get {            return 0        }        set(newValue) {            // set from newValue        }    }}let s1 = SomeClass()struct SomeStruct {    static var someValue = 100    static func staticFunc() -> Int {        return 1    }    var x = 0    var y = 0    var doubleX: Int {        get {            return x * 2        }        set {            x = newValue / 2        }    }    // readonly    var doubleY: Int {        return y * 2    }    var total: Int {        willSet(newTotal) {            print("will set \(newTotal)")        }        didSet {            print("old: \(oldValue), new: \(total)")        }    }    // 如果會改變類成員,比如聲明 mutating    mutating func incrementX() {        self.x += 1    }}var s2 = SomeStruct(x: 2, y: 3, total: 10)s2.doubleX = 10  // s2.x == 5s2.total = 5// 繼承class Animal {    // 構造函數    init() {    }    // 必要構造器,子類必須實現,而且聲明為 required    required init(name: String, age: Int) {    }    func makeNoise() {        print("wowowo")    }}class Cat: Animal {    var name: String = ""    var nickName: String = ""    init(name: String) {        super.init()        self.name = name    }    init(fromNickName nickName: String) {        super.init(name: nickName, age: 18)        self.nickName = nickName    }    // 便利構造器:必須調用其他構造器    convenience override init() {        self.init(name: "UnKnown")    }    // 可失敗構造器    init?(age: Int) {        super.init(name: "UnKnown", age: age)        if age < 0 { return nil }    }    required init(name: String, age: Int) {        self.name = name        super.init(name: name, age: age)    }    // 析構,默認會先調用父類的析構    deinit {    }    override func makeNoise() {        print("miaomiaomiao")    }}final class CannotInheirt {}// 7. 自動引用計數 ARC// weak 弱引用// unowned 無主引用// 8. 可空鏈式調用/* For example:if let johnsStreet = john.residence?.address?.street {    print("John's street name is \(johnsStreet).")} else {    print("Unable to retrieve the address.")}*/// 如果確定有值,使用!// let roomCount = john.residence!.numberOfRooms// 9. 錯誤處理enum CustomError : ErrorType {    case Invalid    case OutOfRange}func makeASandwich() throws -> String {    throw CustomError.Invalid}do {    try makeASandwich()} catch CustomError.Invalid {    print("Invalid")}// 可空let x = try? makeASandwich()// 使錯誤傳遞失效,肯定不throw,否則 assert// let y = try! makeASandwich()// defer 和 Golang 裡的 defer 一樣,用來退出清理/*func processFile(filename: String) throws {    if exists(filename) {        let file = open(filename)        defer {            close(file)        }        while let line = try file.readline() {            // 處理文件        }        // 在這裡,作用域的最後調用 close(file)    }}*/// 10. 類型轉換: is as (和 CSharp 類似)// 任意類型:// 1. AnyObject 任何 class 類型實例// 2. Any 任何類型// 11. 擴展(extension,類似 CSharp 裡的擴展方法,但是貌似更強大)// 比如:擴展內置類型 Double// 幾乎一切都可擴展,用到時再查用法吧extension Double {    var km: Double { return self * 1_000.0 }    var m : Double { return self }    var cm: Double { return self / 100.0 }    var mm: Double { return self / 1_000.0 }    var ft: Double { return self / 3.28084 }}// 12. 協議(類似接口的東西)// 當同時有繼承時,先寫繼承,再寫協議,協議可以有多個protocol FullyNamed {    var fullName: String { get }}// 協議也可繼承protocol SubFullyNamed: FullyNamed {    var nickName: String { get }}struct Person: FullyNamed{    var fullName: String}// 專屬協議,指定只能用在 class 上protocol ClassOnlyProtocol: class, FullyNamed {}protocol Aged {    var age: Int { get set }}// 協議合成func foo(pro: protocol<FullyNamed, Aged>, base: Any) {    // 協議判斷    if let p = base as? Aged {        print(p.age)    }}// 可選協議(既然是協議,還可選,醉了)// @objc protocol// 13. 泛型func swapTwoValues<T>(inout a: T, inout _ b: T) {    let temporaryA = a    a = b    b = temporaryA}// 泛型約束func someFunction<T: SomeClass, U: FullyNamed>(someT: T, someU: U) {    // 這裡是函數主體}// Where/*func allItemsMatch<    C1: Container, C2: Container    where C1.ItemType == C2.ItemType, C1.ItemType: Equatable>    (someContainer: C1, anotherContainer: C2) -> Bool {}*/// 14. 訪問控制// public internal(默認) private// 加在 class var 等前


相關焦點

  • swift語言是什麼?蘋果最新編程swift語言資料
    swift語言是什麼?蘋果最新編程swift語言資料 2014-06-05 11:28 | 作者:SORA | 來源:265G QQ群號:624022706 |
  • MATLAB函數速查手冊
    《MATLAB函數速查手冊》較全面地介紹了MATLAB的函數,主要包括MATLAB操作基礎、矩陣及其基本運算、與數值計算相關的基本函數、符號運算的函數、概率統計函數、繪圖與圖形處理函數、MATLAB程序設計相關函數、Simulink仿真工具函數、圖形用戶界面製作函數、信號處理工具箱函數和符號數學工具箱函數等內容。
  • 《 Swift 程式語言》中文版教程開源
    https://github.com/SwiftGGTeam/the-swift-programming-language-in-chinese項目使用GitBook製作的,可以在線閱讀,原文和翻譯版網址如下。
  • 蘋果最新程式語言Swift教程基礎入門手冊
    蘋果最新程式語言Swift教程基礎入門手冊 來源:www.18183.com作者:集落時間:2014-06-04 隨著蘋果最新程式語言Swift的發布,想必不少程序猿們都要出動了吧
  • 零基礎學習Swift中的數據科學
    作者 | MOHD SANAD ZAKI RIZVI編譯 | VK來源 | Analytics Vidhya概述Swift正迅速成為數據科學中最強大、最有效的語言之一Swift與Python非常相似,所以你會發現2種語言的轉換非常平滑我們將介紹Swift的基礎知識,並學習如何使用該語言構建你的第一個數據科學模型介紹Python被廣泛認為是數據科學中最好
  • 【乾貨】Pandas速查手冊中文
    如果你想學習Pandas,建議先看兩個網站。(1)官網:Python Data Analysis Library(2)十分鐘入門Pandas:10 Minutes to pandas在第一次學習Pandas的過程中,你會發現你需要記憶很多的函數和方法。所以在這裡我們匯總一下Pandas官方文檔中比較常用的函數和方法,以方便大家記憶。
  • iPhone Swift語言雨燕中文手冊入門教程
    iPhone Swift語言雨燕中文手冊入門教程 來源:www.18183.com作者:集落時間:2014-06-03 6月3日消息,蘋果公司於北京時間今日凌晨1時舉行全球開發者大會
  • Swift語言入門視頻教程:簡介及開發環境搭建
    蘋果公司在今年的WWDC大會上發布了全新程式語言Swift,Swift語言的發布對於開發者們,尤其是iOS開發者們來說確實是蘋果開發者大會的一大亮點。我們可以預想到未來的iOS開發招聘信息很可能會變成「招聘iOS程式設計師,要求擁有5年的Swift語言開發經驗」。
  • 初中數學定律公式速查手冊,中考複習必備(精心排版,可列印)
    此速查手冊採用大範圍的歸納整理,對於在大腦中形成一個整體的知識框架十分有益的。數學學習過程中應避免盲目的題海戰術,學習是一個系統歸納的過程,找到各個知識之間的相關聯性,方能形成一個好的思維。只有這樣才能真正地學好數學。如果單獨的刷題也能促進成績的提高,這也是公認的方法,數學在於多做題。
  • swift語言是什麼?
    swift語言是什麼?譯/新浪科技   導語:CNET網站今天刊文稱,蘋果公司(以下簡稱「蘋果」)在今年的WWDC(全球開發者大會)上發布了一款重要產品:程式語言Swift,並隨後發布了對這一語言進行詳解的iBook電子書。終端用戶或許很難感知到這一程式語言帶來的改變,但這可能推動蘋果應用開發者社區的變革。
  • 簡單介紹 Swift on Fedora ——在 Fedora 中使用 Swift
    Swift 是一門通用程式語言,使用現代方法構建安全性、性能和軟體設計模式。它旨在成為各種編程項目的最佳語言 —— 從系統編程到桌面應用程式,以及雲服務。安全,快速,富有表現力和許多現代程式語言一樣,Swift 旨在設計得比基於 C 的程式語言更安全。例如,變量總是在可以使用之前初始化、檢查數組和整數是否存在溢出、內存自動管理等。Swift 將意圖放在語法中。要聲明變量,使用 var 關鍵字;要聲明常量,請使用 let。
  • Swift語言開發入門視頻教程:playground基本用法
    Swift語言開發入門視頻教程:playground基本用法 蘋果公司在今年的WWDC大會上發布了全新程式語言Swift,Swift語言的發布對於開發者們,尤其是iOS開發者們來說確實是蘋果開發者大會的一大亮點
  • 前端開發相關速查表Cheatsheets整理集合
    對於前端開發工程師來說需要花大量的時間去閱讀我們所使用的語言或相關類庫、框架的 API 文檔。當自己寫出函式庫時也會為自己的函式庫加上適當的文檔說明,這是一個避免不了的過程。畢竟前端開發工程師必須把腦力花在邏輯思考上,而不是記憶這些 API 文檔。
  • 15個快速學習蘋果Swift程式語言的入門教程
    函數式編程模式,例如:地圖和過濾器今天為大家帶來15個快速學習蘋果Swift 語言的英文教程。簡單而實用。感興趣的可以去瞧瞧。當我們談論蘋果公司的新程式語言時,應該考慮三個關鍵的因素:如果你知道它是如何工作的,你就會明白,Swift 語言不辜負所有這三樣特點,本教程將告訴你學習Swift語言之前必須知道的最重要的事情。
  • 從Java到Swift
    我們學習的新事物時,通常並不是從0開始,而是從已知開始,將新事物與已知的進行比較分析,從而快速全面地了解新事物。而我熟悉Java,所以在學習Swift時,就會將Swift與Java進行比較,思考。基礎部分1.Swift沒有main函數,這個有點像腳本語言。
  • swift的幾個基本-《編程學習手稿---從「剛入門」到「還湊活」》
    親愛的朋友們,我的微信號搬家了:)請大家點擊上方藍字「文勇圖書館」關注或添加公眾號(wenyonglibrary)記得常來這裡找我首先的首先,讓我們先講一個自黑的笑話,請問一個swift工程獅最先接觸到的5種語言是什麼?
  • Debian中編寫你的第一個Apple Swift程序
    【51CTO.com快譯】Swift是蘋果公司開發的一種程式語言。它是針對iOS、macOS、watchOS、tvOS、Linux和z/OS開發的一種通用多範式編譯程式語言。據開發人員聲稱,Swift是一種編寫軟體的出色方法,無論面向手機、臺式機、伺服器還是運行代碼的其他系統。
  • Wwise Unity 速查表
    這些年來,相關學習資源越來越豐富,隨時都可以拿來參考。就拿 Audiokinetic 官方資源來說,YouTube 上有很多視頻教程,Audiokinetic 問答頁面也有大量詳細解答。除此之外,還有 Wwise-301 課程和 Wwise Unity Integration 文檔。這些對新手入門來說的確很有幫助。不過看完學習資料之後,東西太多難免會忘。
  • 從理論概念到庫函數語法:機器學習速查表全集
    By蔣思源 2017年7月17日  機器之心此前曾提供過機器學習和深度學習最好的九張代碼速查表,不過近日又有博主發表了一次完全的速查表。雖然有一些和以前是重複的,但還是增加了一些新的速查表。本文前一部分主要重點描述新添加的速查表,後一部分再為讀者提供一些以前的速查表資源。這些速查表暫時是保持英文的,因為後面一些不熟悉的庫和函數我們可能編譯不太精確。
  • 看這本手冊就知道
    2月28日,記者從廣州市標準化研究院獲悉,該院根據疫情防控標準需求,及時搜集、整理了疫情防控相關標準,制定的《新冠肺炎疫情防控——醫用防護用品標準速查手冊》(以下簡稱速查手冊)已於近日發布。據介紹,速查手冊已在廣州市標準化研究院微信公眾號發布,免費提供全文閱覽。