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

如何使用Swift中的Objective-C#define,objective-c,macros,swift,Objective C,Macros,Swift,我正在迁移一个UIViewController类,以便使用Swift进行一点训练。我通过桥接头成功地使用了Objective-C代码,但我需要导入一个包含#define指令的常量文件 我在(简单宏)中看到了以下内容: 简单宏 通常使用#define指令在C和Objective-C中定义基本常数,而在Swift中使用全局常数。例如,常数定义#define FADE_ANIMATION_DURATION 0.35可以用let FADE_ANIMATION_DURATION=0.35更好地用Swift

我正在迁移一个
UIViewController
类,以便使用Swift进行一点训练。我通过桥接头成功地使用了Objective-C代码,但我需要导入一个包含
#define
指令的常量文件

我在(简单宏)中看到了以下内容:

简单宏

通常使用
#define
指令在C和Objective-C中定义基本常数,而在Swift中使用全局常数。例如,常数定义
#define FADE_ANIMATION_DURATION 0.35
可以用
let FADE_ANIMATION_DURATION=0.35
更好地用Swift表示。因为简单的常量宏直接映射到Swift全局变量,编译器会自动导入C和Objective-C源文件中定义的简单宏

所以,这似乎是可能的。我已将包含常量的文件导入桥接头,但我无法从我的
文件中查看。无法解析swift
文件

我应该怎么做才能使我的常数对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 }
var B: String { get }
或:

…变成:

var A: CInt { get }
var B: String { get }
不幸的是,
YES
NO
不能被Swift编译器实时识别和转换

我建议您将
#define
s转换为实际常数,这比
#define
s要好

.h:

m

然后斯威夫特会看到:

var kSTRING_CONSTANT: NSString!
var kBOOL_CONSTANT: ObjCBool
另一个选项是将
BOOL
定义更改为

#define kBOOL_CONSTANT 1

更快。但不如实际常数好。

只是对上面几点的简单说明

Swift常量使用关键字
let

例如:

let kStringConstant:String = "a_string_constant"
此外,只有在协议定义中才能使用
{get}
,例如:

protocol MyExampleProtocol {
    var B:String { get }
}

在swift中,您可以在任何类或函数之外声明枚举、变量或函数,它将在您的所有类中(全局)可用(无需导入特定文件)


简单的swift语言不需要宏 所有#定义指令。 将被出租
而复杂的宏应该转换为func

宏的替代项可以是全局变量。我们可以在类外部声明全局变量,并在不使用类的情况下访问这些变量。请查找下面的示例

import Foundation
let BASE_URL = "www.google.com"

class test {

}

请尝试使用true而不是YES。我可以知道您使用NSString的原因吗!而不是绳子?我认为这是因为在使用常数之前,你永远不需要测试它是否为零,所以在使用它时打开它是“安全的”。然而,我会让NSString,但我现在不能与swift兼容:)我假设
#定义
s和
const
s成为常量:即
let
sHow是否通过命令行上的-DCONSTANT=val传递常量,或者如果我们将其更改为let声明,则是否通过xcode plist构建设置传递常量。它有点忽略了它们的全部要点。你认为有必要澄清
kStringConstant
的类型,它可以通过提供的内容推断出来,
“monitoredRegins”
。没有。这只是一种编码实践,任何硬编码字符串我都喜欢放在上面。稍后可以轻松地将其移出常量文件。是的,您是正确的,
  import Foundation
  import MapKit

 let kStringConstant:String = "monitoredRegions"

  class UserLocationData : NSObject {    
class func getAllMonitoredRegions()->[String]{
     defaults.dictionaryForKey(kStringConstant)
 }
import Foundation
let BASE_URL = "www.google.com"

class test {

}