![31 天,從淺到深輕鬆學習 Kotlin](https://i.iter01.com/images/95441ad06fb3e50338beaffc10e98b3646bbde6ed28485aa2d2cc2b3c6ed47af.jpg)
第一週
Day 1:可見性
在 Kotlin 中一切都是預設 public 的。並且 Kotlin 還有一套豐富的可見性修飾符,例如:private, protected, internal。它們每個都以不同的方式降低了可見性。
![31 天,從淺到深輕鬆學習 Kotlin](https://i.iter01.com/images/4133d14c2d2faec6c74f35c9ecf8485e1e924008d3e1177614b338dd5d79340a.jpg)
需要處理程式碼中的空值?可以使用 elvis 操作符,避免您的 “空情況” (null-erplate)。這只是替換空作為值或者返回事件情況的一個小語法。
![31 天,從淺到深輕鬆學習 Kotlin](https://i.iter01.com/images/81c42e961b060ef5118268f823220c11772ed1c38621143265705ac7c89fb1eb.jpg)
格式化字串?將$放在變數名的前面去表達字串中的變數和表示式。使用 ${expression} 求表示式的值。
![31 天,從淺到深輕鬆學習 Kotlin](https://i.iter01.com/images/3a884c7f707957067d36a3e33e9b75094d474abc2a5f969cbe2e1552902998ff.jpg)
強大的 switch!Kotlin 的 When 表達幾乎可以匹配任何東西。字面值,列舉,數字範圍。您甚至可以呼叫任意函式!
![31 天,從淺到深輕鬆學習 Kotlin](https://i.iter01.com/images/4db3a1d9cad289fb676c755a5a6ccbd4610460c7d649355fbf822eafd86da425.jpg)
for 迴圈在與其他兩種 Kotlin 特性一起使用時可以獲得超級能力:範圍表示式和解構。
![31 天,從淺到深輕鬆學習 Kotlin](https://i.iter01.com/images/96fbdc1508d0bb1c14c085eb28152ce0a742c1deb0aec7d319a179e142782112.jpg)
在 Kotlin 中,類可以具有可變和只讀屬性,預設情況下生成 getter 和 setter。如果需要,您也可以實現自定義的。
![31 天,從淺到深輕鬆學習 Kotlin](https://i.iter01.com/images/43cfc70a16dfb5cf397d330841a2b58b5054a0dbbdcb71b391a58903193584e8.jpg)
Android KTX 使用解構來分配顏色的元件值。您可以在您的類中使用解構,或者擴充套件現有的類來新增解構。
![31 天,從淺到深輕鬆學習 Kotlin](https://i.iter01.com/images/311beedc457f4311dfa3e41be1f21830fc7d46725a672aee9aa0a82963a76777.jpg)
本週以基本知識為主:處理空錯誤,簡化迴圈和條件,屬性,解構架。下一週我們將會深入探索 Kotlin 的更多功能。
第二週
Day 8:簡單的 bundle
準備去通過簡潔的方式去建立 bundle,不呼叫 putString,putInt,或它們的 20 個方法中的任何一個。一個呼叫讓您生成一個新的 bundle,它甚至可以處理 Arrays。
![31 天,從淺到深輕鬆學習 Kotlin](https://i.iter01.com/images/64d85e808be4f8cad2c5b9bfebf7f98ab625501122e0aa1e6457c165e3c3c3df.jpg)
喜歡 Parcelable 的速度,但不喜歡寫所有的程式碼?和 @Parcelize 打個招呼。
![31 天,從淺到深輕鬆學習 Kotlin](https://i.iter01.com/images/bc8f0c52703fc4ab44f6e13bd8b1225f176303def1c306b0ea20608e32e7c899.jpg)
可以建立具有一個具有處理資料的類嗎?將它們標記為 "Data" 類。並預設實現生成 equals() 方法 - 相當於 hashCode(),toString() 和copy(),並檢查結構是否相等。
![31 天,從淺到深輕鬆學習 Kotlin](https://i.iter01.com/images/74b6f91185d3d952954d6ebcabcd2fdb62e96ca6f0b8ffeafa998702d649510b.jpg)
Lambda 非常貼心,使用最後一個引數呼叫語法您可以取消回撥,Callable 和 Runnable,例如 Android KTX 貼心的用一個小包裝來處理 postDelayed。
![31 天,從淺到深輕鬆學習 Kotlin](https://i.iter01.com/images/7ee8e40a73291cd6e7d7d454354bb37babeb7a9066ac732ddac21db2b9920e97.jpg)
方法引數的數量是否太多?在函式中指定預設引數值。使用命名引數使程式碼更具可讀性。
![31 天,從淺到深輕鬆學習 Kotlin](https://i.iter01.com/images/1e3fb30c5e0d9535e5f1202f4deeaedccb0e99649f7b5a595710e7aabfc7a80b.jpg)
在同一個專案中使用 Kotlin 和 Java?您有沒有頂級功能或屬性的課程?預設情況下,編譯器將生成類名稱 YourFileKt。通過使用 @file:JvmName 註釋檔案來更改它。
![31 天,從淺到深輕鬆學習 Kotlin](https://i.iter01.com/images/99ec5c9c4c7610370492d9861faadf10e0459430284d9438e7fd468e5f8a4122.jpg)
迭代器用在了有趣的地方!Android KTX 將迭代器新增到 viewGroup 和 sparseArray。要定義迭代器擴充套件請使用 operator 關鍵字。 Foreach 迴圈將使用副檔名!
![31 天,從淺到深輕鬆學習 Kotlin](https://i.iter01.com/images/d6ff25575138ead083ca1c085ba4ce196c87c6b77eb77de7f1749ea9f82e458b.jpg)
這周我們更深入學了 Kotlin 的特性:簡潔 bundle,迭代,Data,postDelay,預設引數,序列化。下一週我們會了解更多的 Kotlin 特性並且開始探索 Android KTX。
第三週
Day 15:sealed 類
Kotlin 的 sealed 類可以讓您輕鬆的處理錯誤資料,當結合 LiveData 您可以用一個 LiveData 同時代表成功和失敗的路徑,這比用兩個不變數要好。
![31 天,從淺到深輕鬆學習 Kotlin](https://i.iter01.com/images/3288d412d97461edbcb1f5f902a797786d6bbe9f6c18fe88f604de86d68b634c.jpg)
![31 天,從淺到深輕鬆學習 Kotlin](https://i.iter01.com/images/cca8c06a964562051818f64747cf478862594e26375b8c1c1c23e166ef4e83fd.jpg)
![31 天,從淺到深輕鬆學習 Kotlin](https://i.iter01.com/images/e98978bf572371e2f81da83db7c8a3c6d8e0f5db8022193c10419ab1d654b3c3.jpg)
懶載入是個好東西!通過使用懶載入,可以省去昂貴的屬性初始化的成本直到它們真正需要。計算值然後儲存併為了未來的任何時候的呼叫。
![31 天,從淺到深輕鬆學習 Kotlin](https://i.iter01.com/images/44be6adecaa5d06bbc07e36cb2883ce6cf47da762be513ea68117497c01e8288.jpg)
Android 中,在 onCreate 或者其它的回撥初始化物件,但在 Kotlin 中不為空的物件必須初始化。那麼怎麼辦呢?可以輸入 lateinit。來承諾最終將會初始化。
![31 天,從淺到深輕鬆學習 Kotlin](https://i.iter01.com/images/2b9f9e09b717c3b8fd3aa2e4f8c57d4ed8263f78045f829c8c50739526b4e15d.jpg)
您方法的引數是有效的嗎?用 require 在使用前可以檢查它們,如果它們是無效的將會丟擲 IllegalArgumentException。
![31 天,從淺到深輕鬆學習 Kotlin](https://i.iter01.com/images/29702804482032641a134cc960be9035ede20e942cc5956f8a8563a5517ce708.jpg)
您的封閉類的狀態是否正確?可以使用 check 來驗證。如果檢查的值為 false,它將丟擲 IllegalStateException。
![31 天,從淺到深輕鬆學習 Kotlin](https://i.iter01.com/images/f00ad542f638e33b3d2a566819b315a02a9350b2632701874d4207cbc1f70096.jpg)
等不及要使用 lambdas 來生成一個新的介面?kotlin 可以使您制定一個 inline 的方法 -- 這意味著呼叫將替換方法體,用很非常簡單的方法來生成 lambda 的介面。
![31 天,從淺到深輕鬆學習 Kotlin](https://i.iter01.com/images/bd544407754d03bc8128f2902c2aae4dd3a7e78fb802d7213deba342dff95707.jpg)
用操作符過載快更快速寫 Kotlin。像 Path,Range或 SpannableStrings 這樣的物件允許像加法或減法這樣的操作。通過 Kotlin,您可以實現自己的操作符。
![31 天,從淺到深輕鬆學習 Kotlin](https://i.iter01.com/images/c880583916535fafb437d6e4ce97e37e7f68c25f19b5afaa836bb14de061f519.jpg)
類的實用方法?將它們新增到原始檔的頂層。在 Java 中,它們被編譯為該類的靜態方法。
![31 天,從淺到深輕鬆學習 Kotlin](https://i.iter01.com/images/d686fe5998f81a7f2c639640246e565c4e8ad2b8fd587b8b2a7007bee4130940.jpg)
![31 天,從淺到深輕鬆學習 Kotlin](https://i.iter01.com/images/fed1c66bebe6aaee0557289ec33e77be5f4cf5464e27e5202663cc26aa76c97d.jpg)
本週主要討論一些基本的 Kotlin 特性,如運算子過載,內聯,運算子過載,懶載入,以及非常強大的 inLine,並展示了使用 Android KTX 處理內容值,捆綁包和回撥時如何編寫更簡潔的程式碼。
第四周
Day 22:簡單的內容值
將 ContentValues 的強大功能與 Kotlin 的簡潔性相結合。使用 Android KTX 只傳遞一個 Pair <StringKey,Value> 建立 ContentValues。
![31 天,從淺到深輕鬆學習 Kotlin](https://i.iter01.com/images/dc04c12c42e2fcc54eaaf98c41fff7f2dacfd9f739f275cf01a425c89637ec49.jpg)
特定於域的語言可以通過使用型別安全的構建器來完成。它們為簡化 API 做出貢獻;您也可以自己藉助擴充套件 lambdas 和型別安全構建器等功能構建它們。
![31 天,從淺到深輕鬆學習 Kotlin](https://i.iter01.com/images/2c82a1c26403314ae81ba69bbff1eaa1c7ad0f18a4b68b9bb23673376f922044.jpg)
![31 天,從淺到深輕鬆學習 Kotlin](https://i.iter01.com/images/adf5d9f026375109cbb9b703be0d5f19c2428845f470cc49c14d18704d8aed54.jpg)
![31 天,從淺到深輕鬆學習 Kotlin](https://i.iter01.com/images/3b7878e87e2e900e8f5ec3ee3569837dc7419885a7049c9e5f2a05d2ba796d0e.jpg)
具體化的概念例子:Android KTX 中的 Context.systemService() 使用泛化來通過泛型傳遞 “真實” 型別。沒有通過 getSystemService。
Android KTX:Context.systemService()
![31 天,從淺到深輕鬆學習 Kotlin](https://i.iter01.com/images/d33c7f73ef2acc59523d3a99da137afe78288358b3cf8a0bbe2ff42b05dde436.jpg)
通過 by 用您的工作委託給另一個類。通過類繼承,並將屬性訪問器邏輯與委託者屬性重用。
![31 天,從淺到深輕鬆學習 Kotlin](https://i.iter01.com/images/333882d69b2ac13331b8f4a32770d3c4cf478814d842f69be286c79372f5c89a.jpg)
沒有更多的 Util 類。通過使用擴充套件功能擴充套件類的功能。把您要擴充套件的類的名字放在您新增的方法的名字前面。
擴充套件功能的一些特性:
-
不是成員函式
-
不要以任何方式修改原始類
-
通過靜態型別資訊解決編譯時間
-
會被編譯為靜態函式
-
不要多型性
例如:String.toUri()
![31 天,從淺到深輕鬆學習 Kotlin](https://i.iter01.com/images/20dbc3bdf55815657a73c978ae9981569d3cec501080d955fc46f2f028235007.jpg)
如果您曾經將 Drawable 轉換為 Bitmap,那麼您知道需要多少樣?Android KTX 具有一系列功能,可以使您的程式碼在使用圖形包中的類時更加簡潔。
![31 天,從淺到深輕鬆學習 Kotlin](https://i.iter01.com/images/48a99d41982510ccf4aab55ba325dd779e948480212811f006e07ac0b0674178.jpg)
序列是從未存在的列表。序列是迭代器的表親,一次只能懶散地產生一個值。這在使用 map 和 fifter 時非常重要 - 它們將建立序列,而不是為每一步都複製列表!
![31 天,從淺到深輕鬆學習 Kotlin](https://i.iter01.com/images/183d3fbce4a8cb6203f34cf766a6701676166640ace9c4b3f32ae12197e88afe.jpg)
![31 天,從淺到深輕鬆學習 Kotlin](https://i.iter01.com/images/a20074fc4736fb6f69a835f7f098352cdf05ee537e43ff19806b6080fee91965.jpg)
功能強大但很難使用 - 這就是 Spans API 感覺的文字樣式。 Android KTX 為一些最常見的 span 新增了擴充套件功能,並使 API 更易於使用。Android KTX: 可跨越字串的構建器
![31 天,從淺到深輕鬆學習 Kotlin](https://i.iter01.com/images/ec28163697d34e434cd9c43eac88ea540827f432b432412517f650f96c8772da.jpg)
通過預設引數擴充套件現有的 API 通常會讓每個人都高興。 Android KTX 允許您使用預設引數在檢視的一側設定填充。一行程式碼可以節省很多程式碼!Android KTX: View.updatePadding
![31 天,從淺到深輕鬆學習 Kotlin](https://i.iter01.com/images/2e319609fd8975e199642befcec383bc578602ec12c73c80ba4d1bdc2f4b567d.jpg)
讓我們執行一些標準的 Kotlin 函式!簡短而強大,run,let,with 和 appy 都有一個接收器 (this),可能有一個引數 (it) 並可能有一個返回值。差異如下:
run
![31 天,從淺到深輕鬆學習 Kotlin](https://i.iter01.com/images/eb36716fe5c8fd58660c49dc0fb4469ca2cfadc3b95550e6a1d94c844adc95f9.jpg)
![31 天,從淺到深輕鬆學習 Kotlin](https://i.iter01.com/images/3aab310bad1422d427ad0b03a07597113e9ed5c0b691800bbff13383faedb60c.jpg)
![31 天,從淺到深輕鬆學習 Kotlin](https://i.iter01.com/images/f861c11efba55a44cf291fd965e76ef54d51466e2b6d67eeff41ea2aab43881a.jpg)
![31 天,從淺到深輕鬆學習 Kotlin](https://i.iter01.com/images/7792b4c83783dd820f04047a739df9026e5f5df2106b8b0f7380ceca0e426fe9.jpg)
本週我們涵蓋了更多語言特性,如 interop,refied 和 sequence,並且在 Android KTX,展示了它幫助您編寫簡潔易讀的程式碼的一些方法。我們也討論了高階特性:領域特定語言 (DSL)。
![31 天,從淺到深輕鬆學習 Kotlin](https://i.iter01.com/images/4b19f302cf5b38c661c44c1875df66d0fab10333e304cd06715a5518bf97f509.gif)
![31 天,從淺到深輕鬆學習 Kotlin](https://i.iter01.com/images/21cc5807ec6267f530c165a03287f749537d6c74a53559254dd5fa6e877ca678.jpg)