1. 程式人生 > >OC&swift中的巨集定義

OC&swift中的巨集定義

在使用OC和swift進行混編時,我們經常會需要在swift中使用OC中的巨集定義,但是這些巨集定義經常會提示無法找到或者型別錯誤,那麼我們到底應該怎麼做才正確呢?

OC中的巨集定義和C一樣,主要有以下幾種情況:


OC巨集定義
  1. 定義一個常量值,後面可以方便使用;如 #define TOOLBAR_HEIGHT 44
  2. 定義一個不會變化的常用變數值,或者一個較長的物件屬性;如#define SCREEN_WIDTH ([[UIScreen mainScreen] bounds].size.width)
  3. 定義一個會變化的常用變數值,或者一個較長的物件屬性;如:#define STATUS_BAR_HEIGHT ([UIApplication sharedApplication].statusBarFrame.size.height)
  4. 定義一個帶引數的巨集,類似於一個函式;如#define RGB_COLOR(r,g,b) [UIColor colorWithRed:r/255.f green:g/255.f blue:b/255.f alpha:1.0]

對於這四種情況,在swift中只能處理第一種情況,而且是直接轉換為了let TOOLBAR_HEIGHT = 44;那麼由於使用TOOLBAR_HEIGTH的地方基本上都是使用CGFloat,而TOOLBAR_HEIGTH的型別卻是Int,就會導致型別不匹配。

所以我們在混編時對於這些巨集定義都需要單獨處理:

swift巨集定義處理
  • 第一種的話就比較簡單,可以直接使用let TOOLBAR_HEIGTH:CGFloat = 44
    來替換就可以了;
  • 第二種因為後面的值永遠不會改變,也可以使用let來替換;可以用let SCREEN_WIDTH = UIScreen.mainScreen().bounds.size.width
  • 第三種情況,也就是後面的值會發生改變,如狀態列高度,就不能夠使用let來替換了,因為let是定義的常量,如果使用let,如果將會導致不能夠獲取正確的值;這裡可以使用函式來獲取:func STATUSBAR_HEIGHT() -> CGFloat { return UIApplication.sharedApplication().statusBarFrame.size.height };使用時通過函式STATUSBAR_HEIGTH()
    獲取狀態列高度;
  • 第四種,因為有輸入引數,所以也只能使用函式來替換;如:func RGB_COLOR(r:CGFloat, g:CGFloat, b:CGFloat) -> UIColor {return UIColor(red: r, green: g, blue: b, alpha: 1.0)};

相關推薦

OC&swift巨集定義

在使用OC和swift進行混編時,我們經常會需要在swift中使用OC中的巨集定義,但是這些巨集定義經常會提示無法找到或者型別錯誤,那麼我們到底應該怎麼做

C語言巨集定義和函式的取捨

原文連結:http://www.embedu.org/Column/Column177.htm 要寫好C語言,漂亮的巨集定義是非常重要的。巨集定義可以幫助我們防止出錯,提高程式碼的可移植性和可讀性等。 在軟體開發過程中,經常有一些常用或者通用的功能或者程式碼段,這些功能既可以寫成函式,也可以

Swift定義類==比較方法未被呼叫的分析和解決

在專案中自定義了2個類:A和B,其中A含有B的例項變數. 在這2個類中都定義了==比較方法,按照正常來說:比較A,必然比較B.因為需要比較A中型別為B的例項變數. 但實際執行中發現,兩個字面上完全一樣的A例項物件,比較竟然不相等!!! 在A的==方法中下斷點,發

穿梭在C/OC/Swift的列舉

最近在github上看見一篇<<招聘一個靠譜的iOS>>,看了看裡面的試題,都是些很基礎又很底層的東西,當然現在還再學習中,能從微博@iOS程式犭袁 所提供的答案中學習到很多之前不知道的知識。現在才察覺到,原來自己的所需要學習的還有很多很

C++巨集定義字串拼接,標誌貼上

關於記號貼上操作符(token paste operator): ## 1. 簡單的說,“##”是一種分隔連線方式,它的作用是先分隔,然後進行強制連線。其中,分隔的作用類似於空格。我們知道在普通的巨集定義中,前處理器一般把空格解釋成分段標誌,對於每一段和前面比較,相同的

[除錯相關]預編譯檔案巨集定義列印日誌

#ifdef DEBUG #define debugLog(...) NSLog(__VA_ARGS__) #define debugMethod() NSLog(@"%s", __func__) #else #define debugLog(...) #define 

C++巨集定義的使用注意事項

1 簡介 巨集定義是C語言的三種預處理功能之一,另外兩種預處理是檔案包含和條件編譯。 1.1 格式 巨集定義的格式分為不帶引數和帶引數兩種。 不帶引數的格式為 #define 巨集名 字串 帶引數的格式為 #define 巨集名(引數表) 字串 1.2 使用 巨集展開是在預

如何為Swift進行巨集定義

這陣子一直在自學Swift, 因為之前iOS的開發一直用Objective-C, 所以習慣了C語言那種巨集定義方式, Swift作為一款更加安全的語言, 放棄了C語言中的巨集定義, 有效的防止預編譯時程式碼巨集替換的安全隱患, 但是也並非不能進行巨集定義, 在這裡我們可

在C語言 巨集定義是什麼?

巨集定義是C提供的三種預處理功能的其中一種,這三種預處理包括:巨集定義、檔案包含、條件編譯 巨集定義又稱為巨集代換、巨集替換,簡稱“巨集”。 格式:#define 識別符號 字串 其中的識別符號就是所謂的符號常量,也稱為“巨集名”。 預處理(預編譯)工作也叫做巨集展開:將巨集名替換為字串。 掌握"巨集"概念的

關於swift定義相機拍照後,擷取照片程式碼

//1.先實現這個方法後得到返回的照片  func scaleToSize(image:UIImage!,size:CGSize) -> UIImage{         // 得到圖片上下文,指定繪製範圍         UIGraphicsBeginImageCo

Swift學習仿照OC巨集定義

在Swift中不需要去建立header檔案,只需要建立一個類即可,什麼也不用配置。下面是一些本人總結的一些常用的巨集定義:let GWIDTH  = UIScreen.main.bounds.size.widthlet GHEIGHT = UIScreen.main.boun

OC定義init方法

dag 一個 主函數 his 括號 聲明 實現 初學 沒有初始化 ---恢復內容開始--- 我們知道,在函數中實例化一個對象,大多數會同時進行初始化,如 Person *p =[ [Person alloc]init]; 此時已經進行了初始化,使用init方法,那麽我們能不

OCSwift的static

  OC: static關鍵字表示靜態,能夠放在區域性變數和全域性變數前面: 限定作用域:對於靜態全域性變數來說,針對某一原始檔的以static宣告的檔案級變數與函式的作用域只限於檔案內(只在檔案內可見),也即“內部連線”,因而可以用來限定變數的作

iOS開發之OCswift開發混編教程,代理的相互呼叫,block的實現。OC呼叫Swift的代理, OC呼叫Swift的Block 閉包

  本文章將從兩個方向分別介紹 OC 與 swift 混編   1. 第一個方向從 swift工程 中引入 oc類    1. 1 如何在swift的類中使用oc類    1.2  如何在swift中實現oc的代理方法  &

C/C++標準巨集定義及其用法

ANSI C標準中有幾個標準預定義巨集 __func__:在原始碼中插入當前所在函式名; __LINE__:在原始碼中插入當前原始碼行號; __FILE__:在原始檔中插入當前原始檔名; __DATE__:在原始檔中插入當前的編譯日期 __TIME__:在原始檔

C的預編譯巨集定義

  在將一個C源程式轉換為可執行程式的過程中, 編譯預處理是最初的步驟. 這一步驟是由前處理器(preprocessor)來完成的. 在源流程式被編譯器處理之前, 前處理器首

Android.mk新增巨集定義

在Boardconfig.mk 中新增一個 IMAGE_FOR_FACTORY_TEST:= true 由於Boardconfig.mk和各目錄的Android.mk是相互關聯的 所以我們可以在Android.mk 中新增 一個 ifdef IMAGE_FOR_FACTO

Unity巨集定義

巨集定義的使用場合:    在程式中我們想要根據不同的執行環境去執行不同的程式碼時使用。比如我們在PC上和安卓上需要執行不同的程式碼,我們就可以使用Unity自帶的巨集定義來區分。 Unity中自帶的巨集定義: UNITY_EDITOR 編譯器呼叫; UNITY_

【轉】巨集定義#和##的使用

https://www.cnblogs.com/zhongzhe/p/3892682.html   #的功能是將其後面的巨集引數進行字串化操作(Stringfication),簡單說就是在對它所引用的巨集變數通過替換後在其左右各加上一個雙引號 ##被稱為連線符(concatenator),用來

STM32的HAL庫的DMA_FLAG_TCIF3_7等幾個巨集定義的含義

DMA_FLAG_TCIF0_4就是指DMA的通道0和通道4,DMA_FLAG_TCIF1_5就是指DMA的通道1和通道5,DMA_FLAG_TCIF2_6就是指DMA的通道2和通道6,DMA_FLAG_TCIF3_7就是指DMA的通道3和通道7。 所以在STM32F429中,使用DMA進行串列埠傳送的時候