导入的 Objc 头文件中 #define 的未解析标识符

Unresolved Identifier from #define in imported Objc header file

我有一个 Obj-c class "constants.h" 看起来像这样:

//  constants.h

#import <Foundation/Foundation.h>

@interface constants : NSObject
#define kLookAhead 3600*24*7*4 //seconds*hours*days*weeks
end

在我的 myProduct-Bridging-Header.h 中,我有:

#import "constants.h"

但是,当我在 Swift class 中调用 kLookAhead 时,例如像这样

let timeInterval = kLookAhead

我收到错误消息 "Use of unresolved identifier 'kLookAhead'"

我在 myProduct-Bridging-Header.h 中导入的所有其他 classes 工作正常,并且 kLookAhead 在我的 objc classes 中成功使用。

有什么我应该知道的吗?

只有 "simple" 宏从 (Objective-)C 导入到 Swift, 比较 "Interacting with C APIs" 中的 "Using Swift with Cocoa and Objective-C"参考。 例如,

#define kSimpleInt 1234
#define kSimpleFloat 12.34
#define kSimpleString "foo"

作为

导入到Swift
public var kSimpleInt: Int32 { get }
public var kSimpleFloat: Double { get }
public var kSimpleString: String { get }

但是

#define kLookAhead 3600*24*7*4

不是进口的。一个可能的解决方案是替换宏 通过静态常量变量定义:

static const int kLookAhead = 3600*24*7*4;

备注:注意一天不一定有24小时,可以 时钟向后或向前调整时为 23 或 25 小时 为夏令时。历法计算一般用DateComponentsCalendar的方法比固定的好 时间间隔。示例:

let now = Date()
let fourWeeksAhead = Calendar.current.date(byAdding: .weekdayOrdinal, value: 4, to: now)

在Swift中,可以通过桥接头文件使用简单的宏。来自 Apple 的 documentation:

Where you typically used the #define directive to define a primitive constant in C and Objective-C, in Swift you use a global constant instead. For example, the constant definition #define FADE_ANIMATION_DURATION 0.35 can be better expressed in Swift with let FADE_ANIMATION_DURATION = 0.35. Because simple constant-like macros map directly to Swift global variables, the compiler automatically imports simple macros defined in C and Objective-C source files.

因此,您假设您的宏应该作为全局常量可用是正确的。但是,我想所有这些乘法使得编译器很难将宏视为一个简单的宏。

我将结果用作示例项目的宏并且有效

#define kLookAhead 2419200 //seconds*hours*days*weeks

let timeInterval = kLookAhead // worked