【Swift】Codable

The simplest way to make a type codable is to declare its properties using types that are already Codable. These types include standard library types like StringInt, and Double; and Foundation types like DateData, and URL. Any type whose properties are codable automatically conforms to Codable just by declaring that conformance.

上面這段是從 Apple Developer Document 節取的,在 standard library types (String, Int, Double)以及 Foundation types (Date, Data, URL),這些類型已經被定義可編碼;若是自行定義的型別也想要可以編碼的話,就是去實作 Codable 協定。實作 Codable 協定的型別,可以使用方法 init(from:)encode(to:)

在自行建構的類別上實作 Codable 可將它們序列化為任何 built-in data 格式以及由行定義編碼器和解碼器提供的任何格式。

carbon (1)


類別包含 Built-in types (ArrayDictionary, Optional)時也符合 Codable。

carbon (2)


如果只需要用到  Encode 或 Decode 其中一個功能,只需要選擇實作 Encodable 或是 Decodable。

carbon (3)

carbon (4)


有時候抓取下來的 JSON 資料的鍵值與我們建構的型態屬性名稱不同時,可以宣告一個特殊的列舉(enum)稱作 CodingKeys 。

這個列舉有一個 String 形態的原始值,並實作 CodingKey 協定;這個列舉內,要定義資料模型內的屬性名稱及所對應的 JSON 內的鍵值,如果屬性名稱相同,則可以省略指定。

carbon (7)

carbon


要處理嵌入式 JSON 物件,要另外定義一個列舉,並宣告 case 屬性名稱及其對應嵌入物件的鍵值。

因為它不是直接對映,需要實作 Decodable 協定的方法 init(from:),來處理所有屬性的解碼工作。在 init 方法,先以 CodingKeys.self 來呼叫解碼器(decoder)的 container(keyedBy:) 方法來取得跟特定編碼鍵有關的資料。

要解碼一個特定值,我們先以特定的鍵(例如 .name )呼叫 decode 方法,並關聯型態(例如 String.self)。title 屬性解碼方式需要一點技巧,必需要以 TheClassKeys.self 呼叫 nestedContainer 方法來取得嵌入 JSON 物件。值回傳後,然後我們進一步解碼 title 的值。

carbon (11)

carbon (9).png

參考資料:ios 11 App 程式設計進階攻略Encoding and Decoding Custom Types

【Data Structure】Valid Parentheses

Given a string containing just the characters '('')''{''}''[' and ']', determine if the input string is valid.

The brackets must close in the correct order, "()" and "()[]{}" are all valid but "(]" and "([)]" are not.

這是 LeetCode 上的一個題目,一開始我的想法是:

  1. 把字串一個一個拆出來解析,例如 “(){}" 拆解成 ‘(‘、’)’、'{‘、’}’。
  2. 在判斷下一個括號是否為前一個括號的另一半邊。
  3. 如果不符合就錯。

我少想了一個情況,如果字串長這樣 “({}[])",這是符合題目的,但是在我的想法裡就會錯誤。

偷偷看了一下討論區的答案,看到了這個解法,於是我參考這個解法。

解法是:

  1. 將字串轉換成字元陣列。
  2. 判斷陣列中的每個字元,若字元是左半邊的括號,就放一個右半邊的括號在 Stack 中。
  3. 若不是左半邊的括號,那麼應該是右半邊的括號或是空陣列,若不是空陣列,將 Stack Pop出來與元素與右半邊的字元比對是否相同。

carbon.png

參考資料:Valid ParenthesesStack

 

【Swift】Cell 動畫特效

UITableViewDelegate 協定內有個方法

willDisplayforRowAt - UITableViewDelegate.jpg

可以讓我們在表格列繪製出來前,自訂 Cell 物件樣式以及在 cell 要出來前設置動畫。

  • 淡入動畫

1.gif

carbon (3).png

  • 旋轉特效

使用 CATransform3DMakeRotation 函式建立動畫特效,這個函式有四個參數:

  1. 弧度(radius):旋轉的角度,因為角度以弧度表示,所以要將度(degree)轉換成弧度。
  2. X 軸:代表畫面左至右的軸。
  3. Y 軸:代表畫面上到底下的軸。
  4. Z 軸:代表垂直畫面的軸。

2.gif

carbon (1).png

  • 飛入特效

使用 CATransform3DTranslate 建立飛入特效。

3.gif

carbon (2).png

  • 限制動畫出現

如何讓動畫特效只在 cell 出現第一次時執行?

宣告一個陣列放置每個 cell 是否已出現過,若出現過的 cell 就給他 true,然後在 tableView(_:willDisplay:forRowAt:) 加入判斷。

參考資料:iOS 11 App 程式設計進階攻略

 

【演算法】貪婪演算法

假設我們要安排明天早上的學習計畫,但是每個計畫的上課時間都不一樣,底下是各個計畫的上課時間。

Java:06:00 – 08:00

Python:07:00 – 09:00

Swift:09:00 – 10:00

Javascript:10:30 – 11:30

CSS:11:10 – 12:00

我們該怎麼安排,才能安排最多計畫呢?

  1. 挑出最早結束的計畫。
  2. 接著找出第一個計劃結束後才開始且最早結束的計畫。

因此第一個最早結束的計劃是 Java。

Java -> ?

Java 結束的時間是 08:00,再來最早結束的計畫是 Swift。

Java -> Swift -> ?

還能再安排嗎?可以,因為 Swift 的結束時間是 10:30,我們的學習計劃是到 12:00,再來最早結束的課程是 Javascript。

Java -> Swift -> Javascript -> ?

Javascript 的結束時間是 11:30,距離我們的學習計畫安排還有30分鐘,還能再安排計畫嗎?再來最早結束的計畫是 CSS,但是他已於 11:10 開始,已不能再安排進我們的時間表了。

因此我們可以得到最後的計劃表。

2018-03-15_22-55-19.png

6點起床會不會有點太早了?還是再回去睡個回籠覺吧!

貪婪演算法的關鍵在於,每個步驟只要挑出一個最佳項目,以技術語言描述,就是每個步驟挑出一個局部最佳解(Local Optimal Solution),最後將每個步驟的最佳解組合成全域最佳解(Global Optimal Solution)。

參考書籍:寫程式前就該懂的演算法:資料分析與程式設計人員必學的邏輯思考術

【生活】第一次

人生難免會有第一次

第一次上學、第一次蹺課、第一次打網咖 ...

好多好多的第一次

在出社會之後,不再像學生時期那樣,無憂無慮的過日子

人總是矛盾的,當還是小孩時,總想要變成大人,像大人可以決定很多事情

當出社會後,又開始還念那無憂無慮的學生時代

今天我也做了出社會後的第一次

向主管說我要離職,當下的心情很複雜,卻又平靜

複雜是因為,提離職沒有經驗,不知道說出後會有什麼結果

平靜是因為,提離職像是解脫,對工作不滿有了宣洩的出口

會想離職有很多因素

可能是薪水不夠好、可能是主管太機車、可能是有更好的機會…

而我才出社會一年,怎麼就想離開了?

我覺得薪水還不錯、我覺得主管人很好、目前也還沒找到新工作…

那是什麼原因我想離開?

我想這個答案就留在我心中吧

人生不就是一直在學習嗎?

「長大不過就是在學習體會人生」

 

 

【Python】讀寫檔案

基本概念

  • 在 Windows 系統中,根目錄是 C:\;在 OSX 和 Linux 系統中,根目錄是 / 
  • 工作目錄(current working directory,簡稱 cwd)
  • 絕對路徑:是從根目錄開始
  • 相對路徑:是相對於程式的目前工作目錄
  • .:當作資料夾名稱使用時,是指「這個資料夾」的縮寫
  • ..:意思是「上層資料夾(父層資料夾)」

讀寫概念

Python 讀寫檔案3步驟:

  1. 呼叫 open() 返回 File 物件 
  2. 呼叫 File 物件的 read() 或 write() 
  3. 呼叫 File 物件的 close() 關閉檔案

如果不想依賴 Python 預設模式,也可以使用明確模式,在 open() 中加入第二個參數 ‘r’。寫入模式會從頭覆蓋原有檔案,以 ‘w’ 傳入 open() 第二個參數。新增模式在原有檔案尾端新增內容,以 ‘a’ 傳入 open() 第二個參數。

Shelve模組

使用 shelve 可以將 Python 程式中的變數儲存到二進位的 shelve 檔案內,這些二進位檔案的格式不重要,只須知道 shelve 能做甚麼事情。

shelve 就像字典,有 key() 和 value() 方法可用,會返回鍵(key)和值(value)的值,這個值和串列相似,但由於不是真的串列,若要取得串列格式,要使用 list() 。

參考網址:https://automatetheboringstuff.com/chapter8/