1

我有一个 Obj-c 类“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 类中调用 kLookAhead 时,例如像这样

let timeInterval = kLookAhead

我收到错误消息“使用未解析的标识符‘kLookAhead’”

我在 myProduct-Bridging-Header.h 中导入的所有其他类都运行良好,并且 kLookAhead 在我的 objc 类中成功使用。

有什么我应该知道的吗?

4

2 回答 2

1

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

#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)
于 2017-11-25T13:50:09.327 回答
1

在 Swift 中,可以通过桥接头文件获得简单的宏。来自苹果的文档

在 C 和 Objective-C 中通常使用 #define 指令定义原始常量,而在 Swift 中则使用全局常量。例如,常量定义 #define FADE_ANIMATION_DURATION 0.35 可以在 Swift 中更好地表达,让 FADE_ANIMATION_DURATION = 0.35。因为简单的类常量宏直接映射到 Swift 全局变量,编译器会自动导入在 C 和 Objective-C 源文件中定义的简单宏。

所以,你假设你的宏应该作为一个全局常量是正确的。但是,我想所有这些乘法都让编译器很难将宏视为一个简单的宏。

我在示例项目中将结果用作宏并且它有效

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

let timeInterval = kLookAhead // worked
于 2017-11-25T13:57:27.300 回答