【讀書筆記】The Swift Programming Language (Swift 4.0.3)

来源:https://www.cnblogs.com/ios122/archive/2018/01/06/8213567.html
-Advertisement-
Play Games

初次接觸 Swift,建議先看下 A Swift Tour 否則思維轉換會很費力,容易卡死或鑽牛角尖。 同樣是每一章只總結3個自己認為最重要的點。這樣挺好!強迫你去思考去取捨。以後再看,也方便快速重建記憶。 註意: 個人筆記,僅供參考,不保證嚴格意義上的正確性。 ...


素材:Language Guide

初次接觸 Swift,建議先看下 A Swift Tour,否則思維轉換會很費力,容易卡死或鑽牛角尖。

同樣是每一章只總結3個自己認為最重要的點。這樣挺好!強迫你去思考去取捨。以後再看,也方便快速重建記憶。

註意: 個人筆記,僅供參考,不保證嚴格意義上的正確性。

The Basics

* 整數,優先使用 Int,浮點數,優先使用 Double
* 可以使用 0b 表示二進位,可以在數字中間插入可讀字元 _,如 182_3880_25
* as 僅用於相容類型間的相互轉換.非相容類型的轉換,由各個類自己的初始化方法實現.

Basic Operators

* 空格對操作符的影響很大,如 a??b 應該寫作 a ?? b, 因為 a? 也是一個有效的操作符.
* a ?? b 返回的是 a unwrap 後的值或 b 的值. ?? 比 js 的 || 好使多了,因為前者能準確區分零值和nil值.只有nil值時,才需要使用預設值.
* names[0..<2] 本質上,是得到了一個數組. ==> 本質上,應該是 array 的[]操作符,重載後,支持了 range 參數.

Strings and Characters

* 多行字元串的起始偏移,是根據末尾的 """ 的偏移 來判定的.
* collection 類型,都有自己的 index struct.String 中涉及的增刪改查操作,適用於所有 collection 類型.
* SubString 的增刪改查,只是一個原有 String 上的游標操作.

Collection Types

* collection type 是struct,是複製傳值,即使只是 a = b
* 操作符重載之後,可以支持數組相加(+)等操作,可以顯著代碼的可讀性和簡潔性
* 能在編譯器推導出的模板類型部分,都可以省略實例類型部分

Control Flow

* switch case 匹配中的 range,也支持源於 String.index 的range
* where 充當一個查詢子句的角色
* \#available的確可以讓API可用性檢查,更方便.

Functions

* 可變字元串的 label 是可以在函數聲明時,由自己指定的. ==> 可變參數,不需要是最後一組參數
* inout 有點像是指針傳值;不同的是,在函數內使用時,不需要處理指針解引用操作,直接一個普通 var 變數使用即可.
* 參數預設是 let 不可變類型,不允許修改

Closures

* function type 不包含 label 部分 --> 傳遞function時,其label部分會被自動忽略. -->  在絕大部分場景中,二者是相容的.
* closure 可以省略參數類型,是因為類型推導機制的存在 --> 尾閉包,可以省略 ();
* 用作函數參數的閉包,如果想在函數外使用,需要額外加 @escaping 標記 ;@autoclosure 會自動補全用作函數參數的閉包的{}符號 --> @autoclosure 標記的閉包,是有可能和其他一般參數標記的參數,函數簽名重覆的.

Enumerations

* 遞歸定義的枚舉,就是一個演示函數式編程的絕佳示例.
* swift 中的枚舉,變成了一中,可以有效承載數據和演算法的描述性數據結構.
* swift 中的 enumeration ,極有可能成為一種新的 Model 載體.

Classes and Structures

* 可選變數,的確會被自動初始化為 nil.
* swift 中,可以設置組件的 frame 了.呼哈哈 label.frame.origin.x = 100.
* String, Array, and Dictionary 竟然是在swift中被實現為結構體了,值傳遞.

Properties

* lazy 關鍵字實現的屬性懶載入,果然比重寫 getter 方法,要清晰簡潔好多啊.
* 可以用 static 或 class 聲明類變數/類方法; 用class 聲明的類變數或類方法,支持子類重寫其實現.
* [self class] 等價寫法是: type(of: self).

Methods

* 結構體實例中,方法是否能夠修改屬性,也受實例本身的可變性的影響.
* 結構體或枚舉等值類型,允許在實例方法內,直接給 self 賦值,完整替換.
* 枚舉類型的相關操作,都可以封裝在枚舉類型自身,這樣封裝性會更好.

Subscripts

* subscript 是一個新的語言特性,不是簡單的函數重寫.
* subscript 可以接收多個參數
* subscript 的參數和返回值,可以完全自定義

Inheritance

* 可以通過 super 來使用父類方法或屬性.
* 可以在方法或屬性前加 final 關鍵字,來禁止被子類重寫.
* 可以在類前加 final 關鍵字,來禁止被繼承.

Initialization

* deisingnated init 一般只調用父類 deisingnated init; convenience init 一般只調用同類的 desingnated init;deisingnated init 中,是不允許調用同級的另一個deisingnated init;子類中,只允許調用父類的 designated init.
* 調用父類初始化方法前,子類自有的 stored property 必須先全部初始化 --> super.init 如果不顯式調用, 系統會自動調用. 在調用 super.init 之前,不能調用任何實例方法,因為對象還沒有效初始化.
* 用 closure 指定預設值和屬性的get/set 方法的區別在於 聲明有個等號(=),說明前者是個賦值操作.

Deinitialization

* 把變數置為 nil,即可觸發 deinit.
* deinit 執行順序:  子類 --> 父類.
* 不能在子類 deinit 中調用 super.deinit.

Optional Chaining

* 在訪問 optional 對象的內部屬性時,必須使用 ? 或 ! 進行 unwrap 操作.
* 賦值操作中,如果左側是要賦值給 optional 實例的某個屬性,則會先 unwrap optional 實例,如果不為nil,才會計算右側的表達式.
* 鏈式語法中,有一個 optional 調用(X?),則返回值必然是 optional 的.

Error Handling

* 函數A中,可以 try 函數B,如果函數B拋出錯誤,則會直接拋給 A 的調用者.
* do-catch 中的catch 部分 和 switch-case 中的case部分,匹配方式很像.
* try? 的作用是是將函數返回值轉換為 optional 對象. try? 的返回值,有可能是多層 optional,層數等於原函數返回值的 optional wrap 層數 + 1.try! 是保證不會拋出異常,如果有,就直接crash.

Type Casting

* is 近似於 isKind; 精確判斷時,可以考慮使用 type(of: T1) == T2.self
* 類型轉換用的是 as? 或 as!,用法習慣和 try? try! 類似.
* 數組具體化類型聲明為 Any / AnyObject 時,數組內可同時存放多種類型不相容的實例.

Nested Types

* 支持類型嵌套定義,這已經是很大的突破了.
* 即使在函數內部,也可以定義新的類型.
* 可以用.語法,訪問嵌套定義的類型.

Extensions

* extensions 和 categories 的重要區別之一是,前者不需要寫名字.
* extensions 不允許覆蓋已有方法,且不同 extentsion 中的方法簽名也不允許重覆.
* extentsion 擴展的東西,是可以被子類繼承的.

Protocols

* 在swift 的設定中, protocol 也屬於 type,可以用於任何 type 適用的場景.
* 在類型聲明遵循某協議以外的位置,書寫符合協議的方法是,用 & 連接多個協議,如 AP&BP&CP.
* protocol 可以在 extension 中定義自己的方法,任意遵循此協議的類型的實例都可以調用此協議自己的方法實現. --> 可以在 extension 實現協議規定的屬性或方法的預設實現. -->可以用 extension-where來指定,僅在特定條件下,才有效的protocal自有協議方法.

Generics

* 泛型類型中的占位類型,也可以用於其自身的 extention 中.
* 可以用類似 <T: SomeClass> 或 <T: SomeAProtocol&SomeBProtocol> 或 where 子句 指定占位類型本身需要滿足的類型或協議約束. --> 藉助 associatedtype 關鍵字, protocol 也可以支持泛型.
* AnyObject 本身不能直接在類型定義時,聲明應遵循的協議的位置使用 --> 可以先定義一個協議 A,繼承自 AnyObject,然後讓類型定義時聲明遵循協議 A,即可間接使用協議 AnyObject.

Automatic Reference Counting

* optional 變數,也是強引用 -> 可以繼續使用 weak 關鍵字聲明弱引用屬性或變數 -> unowned 與 weak 的區別是,前者不會自動置為 nil.
* closure 是引用類型 -> closure 內引用實例屬性,必須加 self首碼 -> closure 的參數聲明前,可以加一個 capture list,如 [unowned self],來解決迴圈引用問題.
* 可以證明,在非 self 以外的情況, closure 並不會引起內部使用變數的引用計數的變化.

Memory Safety

* inout 標記的函數參數,是最容易引起訪問衝突問題的.
* 往同一函數,同時以不同的 inout 參數,傳遞同一個實際變數,會引起訪問衝突 --> 這一行為,可以被自動識別並標記出來
* 類型方法調用,不允許使用自身作為 inout 參數傳遞給自己的某個方法.

Access Control

* 預設訪問級別是 internal,可以在定義它的模塊內的各個源文件之間自由使用.
* fileprivate 和 private 並存,是因為swift中允許類型嵌套定義.
* 子類的訪問級別不能比父類更寬鬆;但是子類可以通過重寫機制,使父類的成員的訪問級別變的更寬鬆.

Advanced Operators

* 重載操作符的語法是: static [prefix|infix|postfix] func 某個操作符 --> == 和 != 也可以重載,來簡化等價判斷操作.
* 複合操作符,要單獨重載,不會自動根據已有操作符自動推導,如 不會根據 + ,自動實現 +=.
* 可以基於已有操作符,聲明自己的操作符: prefix|infix|postfix operator 操作符,infix 二元操作符,要單獨聲明優先順序,如 : infix operator +-: AdditionPrecedence.

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 轉載songdeyouxiang 1、資料庫命名規範採用26個英文字母(區分大小寫)和0-9的自然數(經常不需要)加上下劃線'_'組成;命名簡潔明確(長度不能超過30個字元);例如:user, stat, log, 也可以wifi_user, wifi_stat, wifi_log給資料庫加個首碼; ...
  • 作者:NiceCui 本文謝絕轉載,如需轉載需徵得作者本人同意,謝謝。 本文鏈接:http://www.cnblogs.com/NiceCui/p/8213723.html 郵箱:[email protected] 日期:2017 12 20 mysql安裝、配置 1. yum 下載mysql 僅限 ...
  • 當一張的數據達到幾百萬時,你查詢一次所花的時間會變多,如果有聯合查詢的話,我想有可能會卡在那兒了,那麼分表的目的就在於此,減小資料庫的負擔,縮短查詢時間。 ...
  • 最近項目上裝的mysql服務,分配的磁碟空間太小了,導致binlog兩天時間就能打滿,這裡記錄下處理方式 mysql的binlog日誌是一個很重要的日誌,以事件形式記錄了所有的DDL和DML(除了數據查詢語句)語句,還包含執行的消耗的時間,在數據丟失的緊急情況下,我們可以利用binlog日誌功能進行 ...
  • 學習目標 -理解分層查詢概念 -創建樹形組織報告 -格式化分層數據 -樹形組織排除分支 分層查詢 語法 SELECT [LEVEL],<column>,exper ... FROM <table_name> [WHERE condition(s)] START WITH condition(s) C ...
  • 一、Runtime簡介 1.1 簡單介紹 Runtime簡稱運行時。OC就是運行時機制,也就是在運行時候的一些機制,其中最主要的是消息機制; 對於C語言,函數的調用在編譯的時候會決定調用哪個函數; 對於OC的函數,屬於動態調用的過程,在編譯的時候並不能決定真正調用哪個函數,只有在真正運行的時候才會根 ...
  • 獲取二維碼 通過後臺介面可以獲取小程式任意頁面的二維碼,掃描該二維碼可以直接進入小程式對應的頁面。目前微信支持兩種二維碼,小程式碼(左),小程式二維碼(右),如下所示: 獲取小程式碼 我們推薦生成並使用小程式碼,它具有更好的辨識度。目前有兩個介面可以生成小程式碼,開發者可以根據自己的需要選擇合適的接 ...
  • 感覺自己給自己釋疑,也是一個極為有趣的過程。這次,我還新增了“猜想”一欄,來嘗試回答一些暫時沒有足夠資料支撐的問題。 Swift 版本是:4.0.3。不同版本的 Swift,可能無法復現問題。 個人記錄,僅供參考,不保證嚴格意義上的正確性。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...