分類彙整: Swift

發票對獎相機

延續上個月的練習,我利用 Apple Vision Framework 的文字檢測與辨識功能,寫了一個統一發票的對獎 app,目的是用來對獎傳統的統一發票

傳統的統一發票沒有 QR code,所以我採用檢測文字的方式去檢測發票號碼,然後再比對有沒有中獎。

原始碼:https://github.com/kyumdbot/TaiwanReceiptLottery

Demo 影片:

Apple Vision Framework 試玩

這個月幾乎都在玩 Apple 的 Vision Framework,並寫了幾個 Demo app,分別有:

◎ 人臉檢測與 Object 檢測(查看原始碼):

◎ 手部姿勢檢測(查看原始碼):

◎ 手寫數字檢測(查看原始碼):

我覺得電腦視覺真的太好玩了,可以做很多有趣的應用,而且 Apple 已經推出 ARM 版 CPU 的 Mac 電腦了,希望 Apple 也能出一款體積比 Mac mini 還小的 Mac nano,用 ARM Mac 搭配 Vision Framework 與 CoreML 來做應用,應該會很有競爭力吧 (? 🤔 ,而且 macOS 的 GUI 比較容易寫的說(跟 GTK 相比)…

好書推薦:《人工智慧開發實務 – 使用 Swift》

Practical Artificial Intelligence with Swift 繁體中文版

最近看了《人工智慧開發實務 – 使用 Swift》這本書,覺得這本書寫的真不錯。

不像其他有著艱澀數學與演算法的 Machine Learning 書籍,這本書是屬於實戰類型的書,只用了第十章稍微說明了那些可怕的 ML 演算法,其他章節則教你如何使用 Apple 系統內建的 framework 來做電腦視覺 (Vision)、自然語言處理 (Natural Language)、聲音分析 (Sound Analysis),語音識別 (Speech) 等功能,還有如何使用 CreateML 等工具來訓練自己的 ML 模型。

而且這本書提供了大量的範例程式碼,所以可以很容易的把那些功能運用在現有的 App 上。

這本書真的大推呀!👍 👍 👍

Taipei Maps – 台北生活的工具地圖

我寫了一個 Mac 版的地圖 app:Taipei Maps。

這個 app 目前使用了這些資料集:

  • 公共飲水機
  • 自來水直飲臺
  • Taipei Free 熱點
  • 自行車停放區
  • 垃圾清運點位 (垃圾車)
  • 行人清潔箱 (垃圾桶)
  • 台北市公廁
  • 新北市公廁
  • 郵局營業據點

可在地圖上查看這些資料的位置與相關資訊。

程式碼在此:https://github.com/wlmaplab/TaipeiMaps

電子專案》使用 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 來做。

左邊紅色的電路板是 Blend Micro,中間深藍色電路板是 Arduino Nano 33 IoT。

以下是 Demo 影片與 Source code 連結:

詳細情況請看:https://github.com/kyumdbot/AutoPass

Kotlin’s Nullable vs. Swift’s Optional

最近在學 Kotlin 與重學那個學過但沒有學會過的 Swift,發現 Kotlin 的 nullable 與 Swift 的 Optional 非常像,大概有 87 分像吧 (不能再低了)? 所以我做了個對照表:

補充說明:

  1. 使用 ?.as? 運算子時,傳回值的型態一樣會是 nullable (Kotlin) / Optional (Swift),所以對傳回值的後續處理一樣要用 nullable (Kotlin) / Optional (Swift) 的方式對待之。 (心法:只要傳回值有可能出現空值 ( null / nil ),那個傳回值就會是一個 nullable / Optional 。)
  2. Swift Optional 的驚嘆號 ( ! ) 表示直接把 Optional 變數解包並當成有值去對待,所以當變數是空值 (nil) 的時候,對空值調用方法 (或者說:發送訊息) 時當然會當掉,因為空值無法響應那個方法。例如這行程式:str!.uppercased(),當 str 裡是一個 String 的時候,對它調用 .uppercased() 方法是沒問題的,可是當 str 裡是 nil 的時候,這時就會出錯了,因為 nil 沒有 .uppercased() 這個方法,所以會當掉。Kotlin 的 !! 符號是非空斷言 (Not-Null Assertion),告訴編譯器這個地方出現的值不會是 null,所以編譯器會把它當成非空型態去處理,但是,如果這個值不幸是 null 的話,就會拋出一個例外。
  3. 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 實際上可能會出現兩種情況),然後編譯器就會對這個變數做可空型態的檢查,確保程式碼裡有把出現空值的情況考慮進去。