2016-10-13 263 views
2

我在swift 3中遇到了問題。我試圖在swift項目中使用頭文件。我跟着這個link。它生成了Bridging-Header.h文件,我可以導入另一個頭文件。但是,在swift文件中,我只調用宏常量,而不是函數。例如,頭文件Swift 3無法識別宏功能

#ifndef testHeader_h 
#define testHeader_h 

#if DEBUG 
#define TEST_VALUE 111 
#define TEST_STRING "Test string" 
#endif 

#if DEBUG 
#define DLOG(fmt,...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA__ARGS__) 
#else 
#define DLOG(...) 
#endif 

#endif /* testHeader_h */ 

的.swift文件,

import UIKit 

class ViewController: UIViewController { 

    @IBOutlet weak var txtDisplay: UITextView! 
    @IBOutlet weak var btnPush: UIButton! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 


    @IBAction func setTextView(_ sender: UIButton) { 
//  LogTrace("IN") 
     DLOG(); 
     txtDisplay.text = TEST_STRING 

    } 
} 

正如你看到的,UI只有按鈕和TextView的。當我們按下按鈕時,它會在控制檯中寫入日誌並將文本置於textview中。但是,當我編譯,它獲得誤差

ViewController.swift:29:9: Use of unresolved identifier 'DLOG' 

我不明白的是,當我在迅速文件中刪除線DLOG,它的工作原理,我可以得到宏觀TEST_STRING。爲什麼它不識別宏功能DLOG?

回答

3

從文檔:

複雜的宏

複雜的宏在C和Objective-C使用,但是在斯威夫特沒有對應 。複雜的宏是沒有定義常量的宏,包括括號括起來的函數式的宏( )。您在C和Objective-C中使用複雜宏 以避免類型檢查約束或避免重新鍵入大量樣板代碼。但是,宏可能會使 調試和重構變得困難。在Swift中,您可以使用函數 和泛型來獲得相同的結果,而不會有任何折衷。 因此,C和Objective-C源文件中的複雜宏不能用於Swift代碼。

與Objective-C的斯威夫特遷移指南建議:

聲明簡單的宏作爲全局常量和複雜的宏轉化爲函數。

+0

哦,非常感謝!我知道了。所以,我只是將複雜的宏轉換成swift文件。 – GAVD