Vapor 是一個用 Swift 程式語言開發的 Web Framework,可運行在 macOS 跟 Linux 上,如果想在 Windows 上開發 Vapor Web 應用程式,則可以透過 WSL (Windows Subsystem for Linux) 來使用,本文要介紹如何在 WSL 上設定 Vapor 開發環境。
閱讀全文分類彙整: Swift
台北城垃圾桶地圖 – SwiftUI 版本
原本的《台北城垃圾桶地圖》是用 Objective-C 寫的,我上個月練習 SwiftUI 時,用 SwiftUI 重寫了《台北城垃圾桶地圖》,並重新上架到 App Store。
發票對獎相機
延續上個月的練習,我利用 Apple Vision Framework 的文字檢測與辨識功能,寫了一個統一發票的對獎 app,目的是用來對獎傳統的統一發票。
傳統的統一發票沒有 QR code,所以我採用檢測文字的方式去檢測發票號碼,然後再比對有沒有中獎。
![](https://riddleling.site/wp-content/uploads/2021/01/01.png)
原始碼:https://github.com/kyumdbot/TaiwanReceiptLottery
Demo 影片:
Apple Vision Framework 試玩
這個月幾乎都在玩 Apple 的 Vision Framework,並寫了幾個 Demo app,分別有:
◎ 人臉檢測與 Object 檢測(查看原始碼):
![](https://riddleling.site/wp-content/uploads/2020/12/img01.png)
![](https://riddleling.site/wp-content/uploads/2020/12/img04.png)
◎ 手部姿勢檢測(查看原始碼):
![](https://riddleling.site/wp-content/uploads/2020/12/img01-1.png)
◎ 手寫數字檢測(查看原始碼):
![](https://riddleling.site/wp-content/uploads/2020/12/01-1024x611.png)
我覺得電腦視覺真的太好玩了,可以做很多有趣的應用,而且 Apple 已經推出 ARM 版 CPU 的 Mac 電腦了,希望 Apple 也能出一款體積比 Mac mini 還小的 Mac nano,用 ARM Mac 搭配 Vision Framework 與 CoreML 來做應用,應該會很有競爭力吧 (? 🤔 ,而且 macOS 的 GUI 比較容易寫的說(跟 GTK 相比)…
好書推薦:《人工智慧開發實務 – 使用 Swift》
![](https://riddleling.site/wp-content/uploads/2020/12/IMG_3556-1024x1024.jpg)
最近看了《人工智慧開發實務 – 使用 Swift》這本書,覺得這本書寫的真不錯。
不像其他有著艱澀數學與演算法的 Machine Learning 書籍,這本書是屬於實戰類型的書,只用了第十章稍微說明了那些可怕的 ML 演算法,其他章節則教你如何使用 Apple 系統內建的 framework 來做電腦視覺 (Vision)、自然語言處理 (Natural Language)、聲音分析 (Sound Analysis),語音識別 (Speech) 等功能,還有如何使用 CreateML 等工具來訓練自己的 ML 模型。
而且這本書提供了大量的範例程式碼,所以可以很容易的把那些功能運用在現有的 App 上。
這本書真的大推呀!👍 👍 👍
Taipei Maps – 台北生活的工具地圖
![](https://riddleling.site/wp-content/uploads/2020/08/TpMapIcon_256.png)
我寫了一個 Mac 版的地圖 app:Taipei Maps。
這個 app 目前使用了這些資料集:
- 公共飲水機
- 自來水直飲臺
- Taipei Free 熱點
- 自行車停放區
- 垃圾清運點位 (垃圾車)
- 行人清潔箱 (垃圾桶)
- 台北市公廁
- 新北市公廁
- 郵局營業據點
可在地圖上查看這些資料的位置與相關資訊。
振興三倍券郵局地圖 for iOS
最近我利用政府資料開放平臺的「全國郵局即時振興三倍券販賣存量」資料集,寫了一個地圖 app,順便練習一下 Swift。😌
程式碼在此:https://github.com/wlmaplab/TW-3000Map。
![](https://riddleling.site/wp-content/uploads/2020/07/iPhone8_plus.png)
電子專案》使用 iPhone 的 Touch ID 搭配 Arduino Nano 33 解鎖自己的電腦
最近把以前一個用 B4i 寫的 iOS app 用 Swift 重寫,功能是:用 iPhone 的 Touch ID 解鎖自己的電腦。這個程式的原理很簡單,是用一塊 arduino 模擬成 HID Keyboard,然後 iOS app 透過 BLE 把密碼傳送給 arduino 裝置,接著 arduino 裝置再把密碼輸入到電腦,利用這種方式解鎖電腦。
HID Keyboard 的部分,以前是用 Blend Micro 來做,這次則改用 Arduino Nano 33 IoT 來做。
![](https://riddleling.site/wp-content/uploads/2020/06/EYWh4uYUMAI6P7N-1024x1024.jpeg)
以下是 Demo 影片與 Source code 連結:
程式碼已放到 GitHub 上:https://t.co/9tGDOg3b4s
— 頑皮柴之助 (@riddle_ling) June 16, 2020
Kotlin’s Nullable vs. Swift’s Optional
最近在學 Kotlin 與重學那個學過但沒有學會過的 Swift,發現 Kotlin 的 nullable 與 Swift 的 Optional 非常像,大概有 87 分像吧 (不能再低了)? 所以我做了個對照表:
![](https://riddleling.site/wp-content/uploads/2019/11/Nullable_vs_Optional_v3-985x1024.png)
補充說明:
- 使用 ?. 或 as? 運算子時,傳回值的型態一樣會是 nullable (Kotlin) / Optional (Swift),所以對傳回值的後續處理一樣要用 nullable (Kotlin) / Optional (Swift) 的方式對待之。 (心法:只要傳回值有可能出現空值 ( null / nil ),那個傳回值就會是一個 nullable / Optional 。)
- Swift Optional 的驚嘆號 ( ! ) 表示直接把 Optional 變數解包並當成有值去對待,所以當變數是空值 (nil) 的時候,對空值調用方法 (或者說:發送訊息) 時當然會當掉,因為空值無法響應那個方法。例如這行程式:str!.uppercased(),當 str 裡是一個 String 的時候,對它調用 .uppercased() 方法是沒問題的,可是當 str 裡是 nil 的時候,這時就會出錯了,因為 nil 沒有 .uppercased() 這個方法,所以會當掉。Kotlin 的 !! 符號是非空斷言 (Not-Null Assertion),告訴編譯器這個地方出現的值不會是 null,所以編譯器會把它當成非空型態去處理,但是,如果這個值不幸是 null 的話,就會拋出一個例外。
- Kotlin nullable 與 Swift Optional 不一樣的地方在於:Kotlin nullable 不是一個實際的 Type,例如這行 Kotlin 程式:var str : String? 表示 str 實際上的 Type 會有兩種情況:String 或 null,所以 str 變數的值有可能是一個字串,也有可能是一個空值。但是在 Swift 裡,這行程式:var str : String? 表示 str 的 Type 是一個 Optional,str 變數的值就是一個 Optional,只是這個 Optional 裡的內容可能是一個字串,也可能是一個 nil。也就是説:當一個變數的值可能出現空值時,Swift 用 Optional 去封裝那個變數;但在 Kotlin 裡,把變數宣告成 nullable 的型態時,只是在告訴編譯器,這個變數有可能出現空值 (所以這個變數的 Type 實際上可能會出現兩種情況),然後編譯器就會對這個變數做可空型態的檢查,確保程式碼裡有把出現空值的情況考慮進去。