我正在迁移一个UIViewController
类来训练一下Swift。我通过桥接头成功使用Objective-C代码,但我需要导入一个包含#define
指令的常量文件。
我在Using Swift with Cocoa and Objective-C(简单宏)中看到了以下内容:
简单宏
在通常使用
#define
指令在C和Objective-C中定义基本常量的地方,在Swift中使用全局常量。例如,常量定义#define FADE_ANIMATION_DURATION 0.35
可以在Swift中用let FADE_ANIMATION_DURATION = 0.35
更好地表达。因为简单的类似常量的宏直接映射到Swift全局变量,所以编译器会自动导入在C和Objective-C源文件中定义的简单宏。
所以,它似乎是可能的。我已经将包含我的常量的文件导入到桥接头中,但是我的.swift
文件没有可见性,无法解析。
如何让我的常量对Swift可见?
更新
它似乎与NSString
常量一起使用,但不适用于布尔值:
#define kSTRING_CONSTANT @"a_string_constant" // resolved from swift
#define kBOOL_CONSTANT YES // unresolved from swift
答案 0 :(得分:55)
目前,有些#define
被转换,有些不是。{更具体地说:
#define A 1
...变为:
var A: CInt { get }
或者:
#define B @"b"
...变为:
var B: String { get }
不幸的是,YES
和NO
无法被Swift编译器即时识别和转换。
我建议您将#define
转换为实际常量,这比#define
更好。
·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
定义更改为
#define kBOOL_CONSTANT 1
更快。但不如实际常数好。
答案 1 :(得分:22)
快速澄清一下上面的一些事情。
使用关键字let
例如:
let kStringConstant:String = "a_string_constant"
此外,只有在协议定义中才能使用{get},例如:
protocol MyExampleProtocol {
var B:String { get }
}
答案 2 :(得分:8)
在swift中,您可以在任何类或函数之外声明枚举,变量或函数,它将在所有类中(全局)可用(无需导入特定文件)。
import Foundation
import MapKit
let kStringConstant:String = "monitoredRegions"
class UserLocationData : NSObject {
class func getAllMonitoredRegions()->[String]{
defaults.dictionaryForKey(kStringConstant)
}
答案 3 :(得分:0)
简单快速的语言不需要宏 所有#define指令。 将被允许 和复杂的宏应转换为func
答案 4 :(得分:0)
宏的替代方案可以是全局变量。我们可以在类之外声明全局变量,并在不使用类的情况下访问它们。请找下面的例子
import Foundation
let BASE_URL = "www.google.com"
class test {
}