Swift 3无法识别宏功能

时间:2016-10-13 07:23:08

标签: swift3

我在swift 3中遇到了一个问题。我尝试在swift项目中使用头文件。我跟着这个link。它生成了Bridging-Header.h文件,我可以导入另一个头文件。但是,在swift文件中,我只调用宏常量,而不是函数。例如,头文件

#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'

我不明白,当我在swift文件中删除行DLOG时,它可以工作,我可以得到宏TEST_STRING。为什么它不识别宏功能DLOG?

1 个答案:

答案 0 :(得分:3)

来自文档:

  

复杂宏

     

复杂的宏用于C和Objective-C但没有对应的   在斯威夫特。复杂的宏是不定义常量的宏,   包括带括号的函数式宏。您使用复杂的宏   在C和Objective-C中避免类型检查约束或避免   重新输入大量的样板代码。但是,宏可以做   调试和重构很困难。在Swift中,您可以使用函数   和泛型,以达到相同的结果,没有任何妥协。   因此,C和Objective-C源代码中的复杂宏   您的Swift代码无法使用这些文件。

Objective-C到Swift迁移指南建议:

  

将简单宏声明为全局常量,并将复杂的宏转换为函数。