我有一个看起来像这样的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小时为了节省日光。通常最好将DateComponents
和Calendar
方法用于日历计算而不是固定时间间隔。示例:
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