1. 程式人生 > >如何為Swift進行巨集定義

如何為Swift進行巨集定義

這陣子一直在自學Swift, 因為之前iOS的開發一直用Objective-C, 所以習慣了C語言那種巨集定義方式, Swift作為一款更加安全的語言, 放棄了C語言中的巨集定義, 有效的防止預編譯時程式碼巨集替換的安全隱患, 但是也並非不能進行巨集定義, 在這裡我們可以像java一樣進行全域性常量的定義, 一樣的方便快捷. 簡單的巨集通過常量設定即可, 複雜的巨集就需要使用函式來返回了, 但是使用起來也會很方便, 下面我會分別把OC的巨集定義和Swift的全域性常量拿出來, 讓大家對比比較. 也會詳細的介紹新建巨集定義的方式

  1, OC巨集定義

  1.新建檔案, 選擇iOS -> Source -> Header File

   

  2.然後隨便起個名字就好下一步下一步, 這裡就不贅述了.

  生成的檔案會是一個空的標頭檔案(Header File)

  

  3.C語言的巨集定義, 並不是很嚴謹, 任何程式碼段都可以進行巨集定義, 甚至是無效的無序的亂碼也可以.

  

  因為C語言的機制下, 是在編譯程式碼時將巨集直接替換成你定義的程式碼, 所以這在實際使用中, 也是存有安全隱患的

  4.巨集定義的使用方法

  首先匯入你的標頭檔案, 名字.h即可

  

  這裡面的SCREEN_WIDTH就會在編譯時替換成[UIScreen mainScreen].bounds.size.width, 所以一般的巨集定義函式或者是計算時, 要在外面加括號, 防止一些錯誤的出現, 而在Swift中, 就不會出現這些安全問題.

  2, Swift巨集定義

1.新建檔案, 選擇iOS -> Source -> Swift File

  

  2.同上, 名字你自己隨心意, 畢竟不重要

  生成的會是一個.swift空檔案, 預設應該會是Foundation框架, 自己修改為UIKit即可

  

3.設定巨集定義

  首先, 要理解在swift中的巨集定義的意義, 在swift中, 並非是預編譯程式碼替換, 而是設定全域性常量, 簡單巨集, 直接let 加常量名即可, 複雜的巨集由於必須保證巨集的程式碼的語句的合法性(C語言就不用擔心, 合法不合法都會被替換), 所以使用函式進行實現, 下面會舉例說明.

    

  但是這種巨集定義遠遠不能滿足我們的需要, 如果想要實現上面的那種, 通過對view.X, 獲取到view.frame.origin.x的方式, 就要想其他的辦法了, 因為直接let x = frame.origin.x這種方式明顯不合法

  

這個時候還是想要那種便捷的方式, 就要通過函式來實現了, 把物件作為一個引數, 返回這個控制元件的具體屬性(其實就是對frame的get方法的二次封裝, 方便我們的使用), 下面會舉例說明, 同樣的, 對於其他的巨集定義函式, 在這裡同樣適用, 就不舉例了

  

  4.巨集定義的使用

  Swift和java很像, 不同的是java是可以使用, 系統編譯時會自動引入需要的類, 而Swift不需要引入, 這些相比OC都方便了很多, 不會出現引入一排標頭檔案很醜陋的樣子了, 也避免了很多諸如迴圈引用的情況(但是也並不是絕對的哦, 所以public class還是有其用武之處的)

  這裡我想讓我的navView例項能夠使用view的frame(很多時候純程式碼相對佈局的時候, 會用到諸如view.frame.origin.x + view.frame.size.width的情況, 所以這樣的巨集定義還是很方便的), 示例如下

  

  其他的一些巨集定義, 例如16進位制顏色轉RGB, 一些對於圖片的重繪等方法, 都可以通過全域性的巨集定義來進行, 這將極大的降低不必要的程式碼, 實現程式碼複用, 也節省了開發者的時間, 縮短了開發週期.

  Swift的巨集定義在本質上並不應該稱之為巨集定義, 只是為了方便大家的理解, 實質上是一些全域性常量和函式, 希望大家不要混淆.