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

atx*_*txe 67 macros objective-c swift

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

我在使用Swift与Cocoa和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
Run Code Online (Sandbox Code Playgroud)

fab*_*ier 57

目前,有些#define是转换的,有些则不是.进一步来说:

#define A 1
Run Code Online (Sandbox Code Playgroud)

...变为:

var A: CInt { get }
Run Code Online (Sandbox Code Playgroud)

要么:

#define B @"b"
Run Code Online (Sandbox Code Playgroud)

...变为:

var B: String { get }
Run Code Online (Sandbox Code Playgroud)

遗憾的是,YESNO没有认可和斯威夫特编译器转换的飞行.

我建议你将#defines 转换为实际常数,这比#defines 更好.

.H:

extern NSString* const kSTRING_CONSTANT;
extern const BOOL kBOOL_CONSTANT;
Run Code Online (Sandbox Code Playgroud)

.M

NSString* const kSTRING_CONSTANT = @"a_string_constant";
const BOOL kBOOL_CONSTANT = YES;
Run Code Online (Sandbox Code Playgroud)

然后斯威夫特会看到:

var kSTRING_CONSTANT: NSString!
var kBOOL_CONSTANT: ObjCBool
Run Code Online (Sandbox Code Playgroud)

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

#define kBOOL_CONSTANT 1
Run Code Online (Sandbox Code Playgroud)

快点.但不如实际常数好.


小智 22

只需快速澄清上面的一些事情.

Swift常量使用关键字表示let

例如:

    let kStringConstant:String = "a_string_constant"
Run Code Online (Sandbox Code Playgroud)

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

    protocol MyExampleProtocol {
        var B:String { get }
    }
Run Code Online (Sandbox Code Playgroud)


Ank*_*ain 8

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

  import Foundation
  import MapKit

 let kStringConstant:String = "monitoredRegions"

  class UserLocationData : NSObject {    
class func getAllMonitoredRegions()->[String]{
     defaults.dictionaryForKey(kStringConstant)
 }
Run Code Online (Sandbox Code Playgroud)