UIViewController
クラスを移行して、Swiftで少しトレーニングします。ブリッジングヘッダーを介してObjective-Cコードを正常に使用していますが、#define
ディレクティブを含む定数ファイルをインポートする必要があります。
CocoaとObjective-CでSwiftを使用する (単純なマクロ)で次のことを見ました:
単純なマクロ
CおよびObjective-Cでプリミティブ定数を定義するために通常
#define
ディレクティブを使用した場合、Swiftでは代わりにグローバル定数を使用します。たとえば、定数定義#define FADE_ANIMATION_DURATION 0.35
は、let FADE_ANIMATION_DURATION = 0.35
を使用してSwiftでより適切に表現できます。単純な定数のようなマクロはSwiftグローバル変数に直接マップされるため、コンパイラはCおよびObjective-Cソースファイルで定義された単純なマクロを自動的にインポートします。
だから、それは可能だと思われます。定数を含むファイルをブリッジングヘッダーにインポートしましたが、.Swift
ファイルから可視性がないため、解決できません。
定数をSwiftに表示させるにはどうすればよいですか?
UPDATE:
NSString
定数で動作するようですが、ブール値では動作しません:
#define kSTRING_CONSTANT @"a_string_constant" // resolved from Swift
#define kBOOL_CONSTANT YES // unresolved from Swift
現時点では、いくつかの#define
sが変換され、一部は変換されません。すなわち:
#define A 1
...なる:
var A: CInt { get }
または:
#define B @"b"
...なる:
var B: String { get }
残念ながら、YES
およびNO
は、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定数はkeywordlet
を使用して表現されます
例えば:
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 {
}