从导入的OBJC标头文件中的#Define中未解决的标识符



我有一个看起来像这样的obj-c class.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"

但是,当我在迅速班上称为Klookahead时,例如像这样

let timeInterval = kLookAhead

我收到错误消息"使用未解决的标识符'klookahead'"

我在myproduct-bridging-header.h中导入的所有其他类都很好,而Klookahead成功地用于我的OBJC课程中。

我应该知道吗?

唯一的"简单"宏是从(客观)c导入到swift的,比较"与C API的互动"使用Swift与Cocoa和Objective-C"参考。例如,

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

被进口到

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中,可以通过Bridging标头文件获得简单的宏。摘自Apple的文档:

通常使用#Define指令定义原始指令的地方 在C和Objective-C中常数,在Swift中,您使用全球常数 反而。例如,恒定定义#define fade_animation_duration 0.35可以通过莱特(Let)更好地表达 fade_animation_duration = 0.35。因为简单的恒定宏 直接映射到Swift Global变量,编译器会自动映射 导入在C和Objective-C源文件中定义的简单宏。

因此,您是正确的,假设您的宏应作为全球常数可用。但是,我想所有的乘法使编译器很难将宏视为简单的宏。

我将结果用作示例项目的宏,并且起作用

#define kLookAhead 2419200 //seconds*hours*days*weeks
let timeInterval = kLookAhead // worked

最新更新