16

Objective C ヘッダー ファイルを作成しました。それにいくつかのプロパティを追加しました。
私はファイル で宣言
static NSString* const kColor005C98 = @"005C98";しましたConstants.h

このファイルをBridging-Headerファイルで定義した#import "Constants.h" 今、このプロパティkColor005C98をいくつかの迅速なファイルで使用したい場合、ビルドに失敗し、取得しています

アーキテクチャー armv7 の未定義シンボル: "_kColor005C98"、参照先:

他に何をする必要があるのか​​わからないので、このエラーは発生しませんか? (私は他の目的の Cファイルでこのプロパティを正常に使用しましたが、その場合は問題ありません)

4

1 に答える 1

20

アップデート:

Swift 2/Xcode 7 以降では、次のような静的定数定義

static NSString* const kColor005C98 = @"005C98"; // in Constants.h file

Swiftにインポートされ、問題なく使用できます。


(Swift 1.x の古い回答)コードが

static NSString* const kColor005C98 = @"005C98"; // in Constants.h file

Objective-Cコンパイラによって処理される場合、2 つのものが 1 つのステートメントに結合されたものとして扱われます。

  • 識別子を導入し、その型を記述する変数宣言、および
  • この識別子を実際にインスタンス化/実装する変数定義。

たとえば 、定義と宣言の違いは何ですか? 宣言と定義の違いをよく説明しています。

Swift コンパイラは、ステートメントを宣言としてのみ扱います。したがって、変数はどこにも定義されていないため、リンカー エラーが発生します。

この問題を解決するには、定義を Objective-C ファイルに移動する必要があります。

// Constants.m:
#import "Constants.h"
NSString * const kColor005C98  = @"005C98";

宣言を次の宣言に変更しexternます。

// Constants.h:
extern NSString * const kColor005C98;

または、static修飾子を削除することもできます。

 NSString * const kColor005C98 = @"005C98";

Swiftで動作するようにします。欠点は、この行が複数の Objective-C ファイルに含まれている場合、それらすべてがグローバルに表示されるシンボルを定義し、kColor005C98「重複シンボル」リンカー エラーが発生することです。

もう 1 つの方法は、代わりにマクロ定義を使用することです。

#define kColor005C98 @"005C98"
于 2015-02-18T08:09:03.777 に答える