【讀書筆記】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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...