繁体   English   中英

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

[英]How to use a Objective-C #define from Swift

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

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

简单的宏

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

所以,似乎是有可能的。 我已将包含常量的文件导入到桥接头中,但我无法从.swift文件中.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 }

或者:

#define B @"b"

...变成:

var B: String { get }

不幸的是, YESNO不能被 Swift 编译器即时识别和转换。

我建议您将#define s 转换为实际常量,这无论如何都比#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

另一种选择是将您的BOOL定义更改为

#define kBOOL_CONSTANT 1

快点。 但不如实际常量好。

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

Swift 常量使用关键字let表示

例如:

let kStringConstant:String = "a_string_constant"

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

protocol MyExampleProtocol {
    var B:String { get }
}

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

  import Foundation
  import MapKit

 let kStringConstant:String = "monitoredRegions"

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

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

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

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

class test {

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM