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

Posted

技术标签:

【中文标题】如何在 Swift 中使用 Objective-C #define【英文标题】:How to use a Objective-C #define from Swift 【发布时间】:2014-08-11 02:32:21 【问题描述】:

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

我在Using Swift with Cocoa and Objective-C(简单宏)中看到了以下内容:

简单宏

在 C 和 Objective-C 中通常使用 #define 指令来定义原始常量,而在 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

【问题讨论】:

尝试使用 true 而不是 YES。 【参考方案1】:

目前,有些#defines 已转换,有些则没有。更具体地说:

#define A 1

...变成:

var A: CInt  get 

或者:

#define B @"b"

...变成:

var B: String  get 

很遗憾,YESNO 无法被 Swift 编译器即时识别和转换。

我建议你将#defines 转换为实际的常量,这比#defines 好。

.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

更快。但不如实际常量。

【讨论】:

我想知道你使用 NSString 的原因吗!而不是字符串! ? 我认为这是因为您在使用它之前不必测试常量是否为 nil,因此在使用时解开它是“安全的”。但是我会让 NSString 但此时我对 swift 不太满意 :) 我想#defines 和consts 成为常量:即lets developer.apple.com/library/ios/documentation/Swift/Conceptual/… 如果我们将常量更改为 let 声明,如何通过命令行上的 -DCONSTANT=val 或 xcode plist 构建设置传入常量。它真的有点错过了它们的全部意义。【参考方案2】:

只是从上面快速澄清一些事情。

Swift 常量使用关键字let 表示

例如:

let kStringConstant:String = "a_string_constant"

另外,只有在协议定义中才能使用 get ,例如:

protocol MyExampleProtocol 
    var B:String  get 

【讨论】:

【参考方案3】:

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

  import Foundation
  import MapKit

 let kStringConstant:String = "monitoredRegions"

  class UserLocationData : NSObject     
class func getAllMonitoredRegions()->[String]
     defaults.dictionaryForKey(kStringConstant)
 

【讨论】:

你认为有必要将kStringConstant的类型清空吗?可以通过提供的内容推断"monitoredRegins" 不,不是。它只是一种编码实践,我喜欢将任何硬编码的字符串放在上面。稍后轻松将其移出到常量文件中。【参考方案4】:

简单的快速语言不需要宏 所有#define 指令。 将被让 和复杂的宏应该转换为 func

【讨论】:

是的,你是对的,Using Imported C Macros in Swift【参考方案5】:

宏的替代方案可以是全局变量。我们可以在类之外声明全局变量并在不使用类的情况下访问它们。请在下面找到示例

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

class test 


【讨论】:

以上是关于如何在 Swift 中使用 Objective-C #define的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Objective-C 中使用 Swift 文件?

如何在 Objective-C 中使用 Swift 字符串枚举?

如何在 Flutter 插件的 Swift 编写的 iOS 部分中使用 Objective-C 框架

如何在带有 SwiftPM 的 Objective-C 模块中使用 Swift 模块?

浅谈Swift 2中的Objective-C指针

如何在 Swift 中转换 Objective-C TOCropViewController 委托方法?