patrickS
patrickS

Reputation: 3760

extern NSString not accessible since Swift 2.2

Since the update to Xcode 7.3 with Swift 2.2 I am not able to access variables from an external Objective-C Library.

Since today I was able to access this variables:

extern NSString* const DEFAULT_URL;  

This is defined in an Objective-C Header file from a precompiled .a framework.

In my swift code I only had to call DEFAULT_URL.

Since Swift 2.2 I get the following errror:

Use of unresolved identifier 'DEFAULT_URL'  

I am able to access the classes and methods of this framework, but I can't access extern NSStrings.

Any ideas how to fix this?

Upvotes: 19

Views: 3636

Answers (2)

Mark
Mark

Reputation: 604

@patrickS I had this for a silly reason, my extern const was defined inside an @interface in my .h file. This seems to have made it private to Swift code with this version of XCode / Clang. It applies to all extern consts not just NSString *.

e.g.

//In Foo.h
extern const int kBlah

@interface Foo
...
@end

instead of

//In Foo.h
@interface Foo
extern const int kBlah
...
@end

Upvotes: 35

Thomas Köhn
Thomas Köhn

Reputation: 123

I had the same problem and as in the question, the ext strings were in my case in a dependency-managed (cough pod cough) third party library. So I could not easily move them around without messing everything up in the long run.

I found two solutions:

  1. copy-paste the ext declaration to (the bottom of) your bridging header
  2. write your own static helper class in objective c that provides the ext strings as class methods (and make this static helper available to Swift)

I leave it up to you which of the two solutions you deem less hacky (I went with solution 1, as I am lazy).

Upvotes: 3

Related Questions