web-dev-qa-db-ja.com

SwiftからObjective-C #defineを使用する方法

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
67
atxe

現時点では、いくつかの#definesが変換され、一部は変換されません。すなわち:

#define A 1

...なる:

var A: CInt { get }

または:

#define B @"b"

...なる:

var B: String { get }

残念ながら、YESおよびNOは、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

もっと早く。しかし、実際の定数ほど良くありません。

上からいくつかのことを簡単に説明します。

Swift定数はkeywordletを使用して表現されます

例えば:

    let kStringConstant:String = "a_string_constant"

また、プロトコル定義でのみ{get}を使用できます。例:

    protocol MyExampleProtocol {
        var B:String { get }
    }
22
Joshua

Swiftでは、クラスまたは関数の外部で列挙型、変数、または関数を宣言でき、すべてのクラスで(グローバルに)(特定のファイルをインポートする必要なく)使用できます。

  import Foundation
  import MapKit

 let kStringConstant:String = "monitoredRegions"

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

単純なSwift言語は、すべての#defineディレクティブのマクロを必要としません。 letになり、複雑なマクロはfuncに変換されるはずです

0
Amr Angry

マクロの代わりにグローバル変数を使用できます。クラス外でグローバル変数を宣言し、クラスを使用せずにアクセスできます。以下の例をご覧ください

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

class test {

}
0
Ankit garg