我正在迁移UIViewController课程,以便对Swift进行一些培训。我通过桥接头成功使用了Objective- C代码,但是我需要导入一个包含#define指令的常量文件。
UIViewController
#define
我在结合Swift和Cocoa和Objective-C(简单宏)中看到以下内容:
简单宏 通常#define在C和Objective-C中使用指令定义原始常量的地方,在Swift中使用全局常量代替。例如,常数定义#define FADE_ANIMATION_DURATION 0.35可以在Swift中使用更好地表达let FADE_ANIMATION_DURATION = 0.35。由于简单的类似于常量的宏直接映射到Swift全局变量,因此编译器会自动导入C和Objective-C源文件中定义的简单宏。
简单宏
通常#define在C和Objective-C中使用指令定义原始常量的地方,在Swift中使用全局常量代替。例如,常数定义#define FADE_ANIMATION_DURATION 0.35可以在Swift中使用更好地表达let FADE_ANIMATION_DURATION = 0.35。由于简单的类似于常量的宏直接映射到Swift全局变量,因此编译器会自动导入C和Objective-C源文件中定义的简单宏。
#define FADE_ANIMATION_DURATION 0.35
let FADE_ANIMATION_DURATION = 0.35
因此,似乎有可能。我已经将包含常量的文件导入到桥接头文件中,但是我的.swift文件没有可见性,无法解决。
.swift
我应该怎么做才能使我的常量对Swift可见?
更新:
似乎可以使用NSString常量,但不能使用布尔值:
NSString
#define kSTRING_CONSTANT @"a_string_constant" // resolved from swift #define kBOOL_CONSTANT YES // unresolved from swift
目前,有些#define已转换,有些未转换。进一步来说:
#define A 1
…成为:
var A: CInt { get }
要么:
#define B @"b"
var B: String { get }
遗憾的是,YES并NO没有识别和转换由斯威夫特编译器的飞行。
YES
NO
我建议您将#defines 转换为实际常数,#define无论如何还是要好于s。
。H:
extern NSString* const kSTRING_CONSTANT; extern const BOOL kBOOL_CONSTANT;
.m
NSString* const kSTRING_CONSTANT = @"a_string_constant"; const BOOL kBOOL_CONSTANT = YES;
然后Swift会看到:
var kSTRING_CONSTANT: NSString! var kBOOL_CONSTANT: ObjCBool
另一种选择是将您的BOOL定义更改为
BOOL
#define kBOOL_CONSTANT 1
快点。但不如实际常数。