如何使用Swift中的Objective-C #define

时间:2014-06-20 10:44:58

标签: objective-c macros swift

我正在迁移一个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

5 个答案:

答案 0 :(得分:55)

目前,有些#define被转换,有些不是。{更具体地说:

#define A 1

...变为:

var A: CInt { get }

或者:

#define B @"b"

...变为:

var B: String { get }

不幸的是,YESNO无法被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

表示Swift常量

例如:

    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 {

}