2014-06-10 49 views
24

我試圖在Swift項目中使用第三方Objective-C庫。我已經成功地將庫導入到Xcode中,並且我製作了一個<Project>-Bridging-Header.h文件,允許我在Swift中使用我的Objective-C類。如何在Swift中用#define宏使用Objective-C代碼

但是我似乎遇到了一個問題:Objective-C代碼包含一個帶有宏#define AD_SIZE CGSizeMake(320, 50)Constants.h文件。導入Constants.h到我的<Project>-Bridging-Header.h不會導致我的Swift應用程序可以使用的全局常量AD_SIZE

我做了一些調查,發現蘋果的文檔here under "Complex Macros"

「在斯威夫特,你可以使用的功能和仿製藥來達到同樣的結果 [如複雜的宏]沒有任何妥協。因此, 複雜的宏是在C和Objective-C源文件沒有作出 提供給您的SWIFT CODE。」

讀取後,我得到了它在斯威夫特指定let AD_SIZE = CGSizeMake(320, 50)做工精細,但我希望在未知道這些值發生變化的情況下,保持與圖書館未來的兼容性。

在Swift或我的橋接頭文件中有這個簡單的修復嗎?如果沒有,是否有辦法替換Constants.h中的#define AD_SIZE CGSizeMake(320, 50),並保留與使用舊宏AD_SIZE宏的任何現有Objective-C應用程序向後兼容的方法?

+1

您是否嘗試過使用「靜態CGSize」而不是宏? – jtbandes

+0

查看我的回答 –

回答

5

我在圖書館的Constants.h

extern CGSize const AD_SIZE;

更換

#define AD_SIZE CGSizeMake(320, 50)

並添加

CGSize const AD_SIZE = { .width = 320.0f, .height = 50.0f };

解決了這個

在庫的Constants.m文件中。

10

我所做的是創建一個返回#define的類方法。

實施例:

h文件:

#define AD_SIZE CGSizeMake(320, 50) 
+ (CGSize)adSize; 

.m文件:

+ (CGSize)adSize { return AD_SIZE; } 

而在夫特:

由於這是一種類方法,因此您現在可以像使用#define一樣使用它。 如果您改變的#define宏 - 這將反映在您創建 在斯威夫特的新方法:

令大小= YourClass.adSize()

4

類聲明後,寫你的常量。像這樣...

class ForgotPasswrdViewController: UIViewController { 
let IS_IPHONE5 = fabs(UIScreen.mainScreen().bounds.size.height-568) < 1; 
let Tag_iamTxtf = 101 
+0

天啊。你認爲有一個567.5像素高的手機嗎?只需編寫bounds.size.height == 568.並且意識到您的宏命名錯誤,因爲放大模式下的iPod Touch或iPhone 6/7具有相同的高度。 – gnasher729

+0

謝謝@ gnasher729,你可以編輯我的答案。 –

相關問題