如何使用Swift中的Objective-C #define
我正在迁移一个UIViewController
类来训练一下Swift。 我通过桥接头成功使用Objective-C代码,但是我需要导入一个包含#define
指令的常量文件。
我在使用cocoa和Objective-C (简单macros)的Swift中看到了以下内容:
简单的macros
在通常使用
#define
指令来定义C和Objective-C中的原始常量的地方,Swift中使用全局常量。 例如,常量定义#define FADE_ANIMATION_DURATION 0.35
可以在Swift中更好地expression,let FADE_ANIMATION_DURATION = 0.35
。 由于简单的常量macros直接映射到Swift全局variables,因此编译器会自动导入C和Objective-C源文件中定义的简单macros。
所以,这似乎是可能的。 我已经将包含常量的文件导入到桥接头文件中,但是我的.swift
文件没有可见性,无法parsing。
我该怎么做才能让我的常量在Swift中可见?
更新:
它似乎与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
不能被Swift编译器实时识别和转换。
我build议你把你的#define
转换成实际的常量,总比#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
另一种select是改变你的BOOL
定义
#define kBOOL_CONSTANT 1
更快。 但不如实际的常数。
只是从上面几件事情快速澄清。
Swift常量使用关键字let
来表示
例如:
let kStringConstant:String = "a_string_constant"
另外,只有在协议定义中,你可以使用{get},例如:
protocol MyExampleProtocol { var B:String { get } }
在swift中,可以在任何类或函数之外声明一个枚举,variables或函数,并且它将在所有类(全局)中可用(不需要导入特定文件)。
import Foundation import MapKit let kStringConstant:String = "monitoredRegions" class UserLocationData : NSObject { class func getAllMonitoredRegions()->[String]{ defaults.dictionaryForKey(kStringConstant) }
简单的swift语言不需要一个macros的所有#define指令。 将会让复杂的macros转换为func
macros的替代可以是全局variables。 我们可以在类之外声明全局variables,并且可以不使用类来访问它们。 请看下面的例子
导入基金会让BASE_URL =“www.google.com”
class级考试{
}