我在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?
答案 0 :(得分:3)
来自文档:
复杂宏
复杂的宏用于C和Objective-C但没有对应的 在斯威夫特。复杂的宏是不定义常量的宏, 包括带括号的函数式宏。您使用复杂的宏 在C和Objective-C中避免类型检查约束或避免 重新输入大量的样板代码。但是,宏可以做 调试和重构很困难。在Swift中,您可以使用函数 和泛型,以达到相同的结果,没有任何妥协。 因此,C和Objective-C源代码中的复杂宏 您的Swift代码无法使用这些文件。
Objective-C到Swift迁移指南建议:
将简单宏声明为全局常量,并将复杂的宏转换为函数。