1132

In Swift, how does one call Objective-C code?

Apple mentioned that they could co-exist in one application, but does this mean that one could technically re-use old classes made in Objective-C whilst building new classes in Swift?

TylerH
  • 20,799
  • 66
  • 75
  • 101
David Mulder
  • 26,123
  • 9
  • 51
  • 114
  • 14
    See Apple's guide to [Using Swift with Cocoa and Objective-C](https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/index.html#//apple_ref/doc/uid/TP40014216). – rickster Jun 02 '14 at 20:28
  • 2
    https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html#//apple_ref/doc/uid/TP40014216-CH10-XID_75 – John Riselvato Jun 03 '14 at 19:06
  • Question sounds good but one thing is bothering me -- What do you mean by "Objective-C is a platform-independent language"? – Evol Gate Jun 07 '14 at 14:07
  • @EvolGate: Just that for example with gcc you can compile Objective C code just as easily on linux as you can on a mac, so you can use the same code and executables on a lot of platforms (only match for this is java and only thing that beats it is the web stack). – David Mulder Jun 07 '14 at 14:10
  • I totally agree but still calling it a platform independent language would be too much. – Evol Gate Jun 07 '14 at 14:15
  • @EvolGate: As in... you would prefer the term cross-platform language? But even swift is cross platform, so which term would you use for all the languages which can be run on nearly any platform? – David Mulder Jun 07 '14 at 14:18
  • 1
    @AnalogFile: 1) Repetition of documentation resources is something StackOverflow is perfectly fine with. And apparently I was not the only one wondering as most people come here from Google. 2) Read the bounty description ;-) – David Mulder Jun 07 '14 at 14:26
  • 6
    @EvolGate: exactly what is missing from Objective C that prevents it from being a platform independent language? The language and the language standard libraries are open source. You can use Objective C in and for Windows, Os X, Linux, BSD, Solaris and any other platform supported by either GCC or LLVM. You can easily port Objective C to any platform with a decent C compiler even if it's supported by neither GCC nor LLVM. I do not see how it could be more platform independent than this. – Analog File Jun 07 '14 at 14:29
  • @DavidMulder: yes. And that's why I did not flag the question. I just thought RTFM in my mind. – Analog File Jun 07 '14 at 14:36
  • 3
    @DavidMulder: Is "The Reasoning" section still needed ? – franck Apr 20 '16 at 17:45
  • If we you're interested about why **header** files are needed and how it's used during the **linking** phase, then make sure you read this [Manual Swift: Understanding the Swift/Objective-C Build Pipeline](https://www.bignerdranch.com/blog/manual-swift-understanding-the-swift-objective-c-build-pipeline/) @Logan You might want to add this link to the answer – mfaani Aug 11 '19 at 19:49

17 Answers17

1554

Using Objective-C Classes in Swift

If you have an existing class that you'd like to use, perform Step 2 and then skip to Step 5. (For some cases, I had to add an explicit #import <Foundation/Foundation.h to an older Objective-C File.)

Step 1: Add Objective-C Implementation -- .m

Add a .m file to your class, and name it CustomObject.m.

Step 2: Add Bridging Header

When adding your .m file, you'll likely be hit with a prompt that looks like this:

A macOS sheet-style dialog from Xcode asking if you would "like to configure an Objective-C bridging header"

Click Yes!

If you did not see the prompt, or accidentally deleted your bridging header, add a new .h file to your project and name it <#YourProjectName#>-Bridging-Header.h.

In some situations, particularly when working with Objective-C frameworks, you don't add an Objective-C class explicitly and Xcode can't find the linker. In this case, create your .h file named as mentioned above, then make sure you link its path in your target's project settings like so:

An animation demonstrating the above paragraph

Note:

It's best practice to link your project using the $(SRCROOT) macro so that if you move your project, or work on it with others using a remote repository, it will still work. $(SRCROOT) can be thought of as the directory that contains your .xcodeproj file. It might look like this:

$(SRCROOT)/Folder/Folder/<#YourProjectName#>-Bridging-Header.h

Step 3: Add Objective-C Header -- .h

Add another .h file and name it CustomObject.h.

Step 4: Build your Objective-C Class

In CustomObject.h

#import <Foundation/Foundation.h>

@interface CustomObject : NSObject

@property (strong, nonatomic) id someProperty;

- (void) someMethod;

@end

In CustomObject.m

#import "CustomObject.h"

@implementation CustomObject 

- (void) someMethod {
    NSLog(@"SomeMethod Ran");
}

@end

Step 5: Add Class to Bridging-Header

In YourProject-Bridging-Header.h:

#import "CustomObject.h"

Step 6: Use your Object

In SomeSwiftFile.swift:

var instanceOfCustomObject = CustomObject()
instanceOfCustomObject.someProperty = "Hello World"
print(instanceOfCustomObject.someProperty)
instanceOfCustomObject.someMethod()

There is no need to import explicitly; that's what the bridging header is for.

Using Swift Classes in Objective-C

Step 1: Create New Swift Class

Add a .swift file to your project, and name it MySwiftObject.swift.

In MySwiftObject.swift:

import Foundation

@objc(MySwiftObject)
class MySwiftObject : NSObject {

    @objc
    var someProperty: AnyObject = "Some Initializer Val" as NSString

    init() {}

    @objc
    func someFunction(someArg: Any) -> NSString {
        return "You sent me \(someArg)"
    }
}

Step 2: Import Swift Files to ObjC Class

In SomeRandomClass.m:

#import "<#YourProjectName#>-Swift.h"

The file:<#YourProjectName#>-Swift.h should already be created automatically in your project, even if you can not see it.

Step 3: Use your class

MySwiftObject * myOb = [MySwiftObject new];
NSLog(@"MyOb.someProperty: %@", myOb.someProperty);
myOb.someProperty = @"Hello World";
NSLog(@"MyOb.someProperty: %@", myOb.someProperty);

NSString * retString = [myOb someFunctionWithSomeArg:@"Arg"];

NSLog(@"RetString: %@", retString);

Notes:

  1. If Code Completion isn't behaving as you expect, try running a quick build with R to help Xcode find some of the Objective-C code from a Swift context and vice versa.

  2. If you add a .swift file to an older project and get the error dyld: Library not loaded: @rpath/libswift_stdlib_core.dylib, try completely restarting Xcode.

  3. While it was originally possible to use pure Swift classes (Not descendents of NSObject) which are visible to Objective-C by using the @objc prefix, this is no longer possible. Now, to be visible in Objective-C, the Swift object must either be a class conforming to NSObjectProtocol (easiest way to do this is to inherit from NSObject), or to be an enum marked @objc with a raw value of some integer type like Int. You may view the edit history for an example of Swift 1.x code using @objc without these restrictions.

Ky -
  • 30,724
  • 51
  • 192
  • 308
Logan
  • 52,262
  • 20
  • 99
  • 128
  • 6
    It is important you need to annotate methods with @objc or Swift methods won't be visible from Objective-C. – Tomáš Linhart Jun 03 '14 at 11:19
  • @TomášLinhart -- I didn't find it necessary to do that, is there a specific use case you're referring to? – Logan Jun 03 '14 at 13:41
  • 31
    You are right. You only need to specify it if you don't use Cocoa objects. ***To be accessible and usable in Objective-C, a Swift class must be a descendant of an Objective-C class or it must be marked @objc.*** – Tomáš Linhart Jun 03 '14 at 13:48
  • 1
    Where is this <#YourProjectName#>-Swift.h? Is it generated at compile time? – Markus Rautopuro Jun 03 '14 at 16:17
  • @MarkusRautopuro - I don't know where it is in the directory, but it's generated automatically. The only way that I've been able to actually see it is when I had an error on it and I was able to click through the debugger to the file. Let me know if you find it. – Logan Jun 03 '14 at 16:22
  • By the way, where did you pull this information from (that <#YourProjectName#>-Swift.h exists)? – Markus Rautopuro Jun 03 '14 at 16:23
  • 2
    @MarkusRautopuro - Got it from here: https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html#//apple_ref/doc/uid/TP40014216-CH10-XID_75" – Logan Jun 03 '14 at 16:25
  • 2
    See also: WWDC 2014 Session 406: Integrating Swift with Objective-C – Stuart M Jun 05 '14 at 07:27
  • Guys I am new to iOS development. I am using Swift and trying to added XMLRPC libraries to my project. Xcode 6 not giving prompt for generating bridge-header file. Please help me on this – ravivlb Jun 19 '14 at 06:27
  • @ravivlb - Look at Step 2. Just add a '.h' w/ appropriate name. – Logan Jun 19 '14 at 11:18
  • 1
    What if the Objective C library has other Objective C dependencies? – User Oct 07 '14 at 03:19
  • 1
    @macdonjo - If those dependencies are included internally within the library, it should be fine as long as they're included in the project. If you need to access those libraries externally, I'm not positive, but I believe that as long as they are imported in the same header, you should be ok. – Logan Oct 07 '14 at 13:11
  • 6
    If importing a Objective C framework into Swift, make sure to import all frameworks that the Obj C framework depends on into your project (in Build Phases -> Link Binary With Libraries), then add #import's for those to a prefix header file, which must be added to your project in build settings (in the Prefix Header field). This includes frameworks like UIKit and Foundation, even if those are already used from within Swift. This tripped me up for hours, and no one seems to have documented these steps. – jeremywhuff Nov 20 '14 at 21:29
  • 1
    This was critical to add to my Objective C files that I wanted to import into Swift. I missed it and wasted a lot of time: #import – h4labs Dec 12 '14 at 18:40
  • @Logan why did you name it CustomClass.m and CustomClass.h? Couldn't this be named anything? What do I name these files if I want to create more than one? – Andrew Aug 07 '15 at 14:44
  • 1
    @AndrewAnthonyGerst in objective-c it's convention to name the files after the name of the class, and there's rarely more than one class per file. So yes, you could name it anything, but I wouldn't recommend it. If you want more than one class, create a new .h and .m for each class. – Logan Aug 07 '15 at 14:54
  • 1
    I my case Using Swift Classes in Objective-C. But get the error **file not found** when import **#import "<#ProjectName#>-Swift.h"**. Please help me resolve this. – lee Sep 04 '15 at 10:24
  • 2
    @lee - Can you go to your build settings and ensure that your `Product Module Name` is what you expect, the syntax is really `#import "ProductModuleName-Swift.h`, it just defaults to project name and most people don't change it. – Logan Sep 04 '15 at 13:26
  • In SomeSwiftFile.swift: I got this: **Expected declaration** on "instanceOfCustomObject.someProperty = "Hello World" Why?Thanks. – Sparkxxf Nov 21 '15 at 03:54
  • 2
    Thanks @Logan this worked for me but the only thing I Noticed different is that with xcode 7.3 when you add .m or .h files there is no pop up coming for creating the bridging header you have to manually go to Build Settings and do it or may be something is wrong with my project settings :). – AmJa Apr 27 '16 at 21:39
  • Why the hell does the `-Swift.h` file go into the `.m` file? – Alper Mar 08 '18 at 11:06
  • 1
    @Alper the system will generate a "bridging header" that exposes the accessible swift code to ObjC. This needs to be imported as any other file would be. For example, `import OtherObject.h` to import an ObjC class header. For Swift, we don't import classes individually, but rather need to import _all_ accessible objects – Logan Mar 09 '18 at 19:18
  • But why not put it in the `.h` file? – Alper Mar 09 '18 at 20:25
  • 1
    @Alper that question is more about ObjC in general. If you import in the `.h` file, then all subsequent imports of _that_ file will _also_ import the other file. This can be useful if one object always needs another, but it can also lead to circular dependencies where A.h imports B.h imports C.h imports A.h. By putting it in the `.m` file, we keep it private to this class and subsequent imports don't _also_ import that file. In Swift here, if we have `Object.{h,m}` and we imported in `Object.h`, then every time somebody imported `Object.h` in another file, they'd _also_ import all Swift files. – Logan Mar 09 '18 at 20:46
  • Works for 100%. One of the rarest cases. If you want to make this simpler you can: *create Obj.-C file *bridging-header will be generated. Describe all function in the generated file. – J A S K I E R Jul 10 '18 at 17:16
  • 1
    In the section for **Using Swift Classes in Objective-C**, the **Step 3** example shows calling a swift method with a parameter `:someArg`. In Xcode10, the given code gives an error `“No visible @interface for 'MySwiftInterface' declares the selector 'someFunction:`. To fix this error, the first parameter name should be incorporated into the method name, like this: `NSString * retString = [myOb someFunctionWithSomeArg:@"Arg"];` – djruss70 Jan 13 '19 at 13:12
  • If we you're interested about why header files are needed and how it's used during the linking phase, then make sure you read this [Manual Swift: Understanding the Swift/Objective-C Build Pipeline](https://www.bignerdranch.com/blog/manual-swift-understanding-the-swift-objective-c-build-pipeline/) @Logan You might want to add this link to the answer – mfaani Aug 11 '19 at 12:17
133

See Apple's guide to Using Swift with Cocoa and Objective-C. This guide covers how to use Objective-C and C code from Swift and vice versa and has recommendations for how to convert a project or mix and match Objective-C/C and Swift parts in an existing project.

The compiler automatically generates Swift syntax for calling C functions and Objective-C methods. As seen in the documentation, this Objective-C:

UITableView *myTableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];

turns into this Swift code:

let myTableView: UITableView = UITableView(frame: CGRectZero, style: .Grouped)

Xcode also does this translation on the fly — you can use Open Quickly while editing a Swift file and type an Objective-C class name, and it'll take you to a Swift-ified version of the class header. (You can also get this by cmd-clicking on an API symbol in a Swift file.) And all the API reference documentation in the iOS 8 and OS X v10.10 (Yosemite) developer libraries is visible in both Objective-C and Swift forms (e.g. UIView).

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
rickster
  • 124,678
  • 26
  • 272
  • 326
  • 3
    The direct link to **Apple documentation** how to integrate Swift in existing project: https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html#//apple_ref/doc/uid/TP40014216-CH10-XID_75 – skywinder Jun 04 '14 at 11:55
  • If we you're interested about why header files are needed and how it's used during the linking phase, then make sure you read this [Manual Swift: Understanding the Swift/Objective-C Build Pipeline](https://www.bignerdranch.com/blog/manual-swift-understanding-the-swift-objective-c-build-pipeline/) – mfaani Aug 11 '19 at 12:16
  • Simpler: let myTableView = UITableView(...) – gnasher729 Dec 13 '21 at 19:36
70

Here are step-by-step instructions for using Objective-C code (in this case, a framework provided by a third-party) in a Swift project:

  1. Add any Objective-C file to your Swift project by choosing File -> New -> New File -> Objective-C File. Upon saving, Xcode will ask if you want to add a bridging header. Choose 'Yes'. Gif: adding empty file to project and generating bridging header
    (source: derrrick.com)

In simple steps:

  1. A prompt appears, and then click on OK... If it does not appear, then we create it manually like in the following... Create one header file from iOS source and give the name ProjectName-Bridging-Header (example: Test-Bridging-Header), and then go to build setting in the Swift compiler code -> Objective-C bridge add Objective-C bridge name ..(Test/Test-Bridging-Header.h). Yeah, that's complete.

  2. Optionally, delete the Objective-C file you added (named "anything" in the GIF image above). You don't need it any more.

  3. Open the bridging header file -- the filename is of the form [YourProject]-Bridging-Header.h. It includes an Xcode-provided comment. Add a line of code for the Objective-C file you want to include, such as a third-party framework. For example, to add Mixpanel to your project, you will need to add the following line of code to the bridging header file:

    #import "Mixpanel.h"
  4. Now in any Swift file you can use existing Objective-C code, in the Swift syntax (in the case of this example, and you can call Mixpanel SDK methods, etc.). You need to familiarize yourself with how Xcode translates Objective-C to Swift. Apple's guide is a quick read. Or see this answer for an incomplete summary.

Example for Mixpanel:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    Mixpanel.sharedInstanceWithToken("your-token")
    return true
}

That's it!

Note: If you remove the bridging header file from your project, be sure to go into Build Settings and remove the value for "Objective-C Bridging Header" under "Swift Compiler - Code Generation".

Glorfindel
  • 21,988
  • 13
  • 81
  • 109
derrrick
  • 721
  • 8
  • 9
45

You can read the nice post Swift & Cocoapods. Basically, we need to create a bridging header file and put all Objective-C headers there. And then we need to reference it from our build settings. After that, we can use the Objective-C code.

let manager = AFHTTPRequestOperationManager()
manager.GET(
  "http://example.com/resources.json",
  parameters: nil,
  success: { (operation: AFHTTPRequestOperation!,
              responseObject: AnyObject!) in
      println("JSON: " + responseObject.description)
  },
  failure: { (operation: AFHTTPRequestOperation!,
              error: NSError!) in
      println("Error: " + error.localizedDescription)
  })

Also have a look at Apple's document Using Swift with Cocoa and Objective-C as well.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Jake Lin
  • 11,146
  • 6
  • 29
  • 40
30

I wrote a simple Xcode 6 project that shows how to mix C++, Objective-C and Swift code:

https://github.com/romitagl/shared/tree/master/C-ObjC-Swift/Performance_Console

In particular, the example calls an Objective-C and a C++ function from the Swift.

The key is to create a shared header, Project-Bridging-Header.h, and put the Objective-C headers there.

Please download the project as a complete example.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Gian Luigi Romita
  • 1,121
  • 7
  • 4
30

One more thing I would like to add here:

I am very thankful for @Logan's answer. It helps a lot to create a bridge file and setups.

But after doing all these steps I'm still not getting an Objective-C class in Swift.

I used the cocoapods library and integrated it into my project. Which is pod "pop".

So if you are using Objective-C pods in Swift then there may be a chance that you can not able to get or import the classes into Swift.

The simple thing you have to do is:

  1. Go to <YOUR-PROJECT>-Bridging-Header file and
  2. Replace the statement #import <ObjC_Framework> to @import ObjC_Framework

For example: (Pop library)

Replace

#import <pop/POP.h>

with

@import pop;

Use clang import when #import is not working.

Community
  • 1
  • 1
Kampai
  • 22,848
  • 21
  • 95
  • 95
  • *Use clang import when #import is not working.* what? Didn't just say we should use @import ?! – mfaani Dec 02 '16 at 03:44
28

Quote from the documentation:

Any Objective-C framework (or C library) that’s accessible as a module can be imported directly into Swift. This includes all of the Objective-C system frameworks—such as Foundation, UIKit, and SpriteKit—as well as common C libraries supplied with the system. For example, to import Foundation, simply add this import statement to the top of the Swift file you’re working in:

import Foundation

This import makes all of the Foundation APIs—including NSDate, NSURL, NSMutableData, and all of their methods, properties, and categories—directly available in Swift.

Gergo Erdosi
  • 40,904
  • 21
  • 118
  • 94
17

Mixing Objective-C and Swift

Hight level diagram:

Same Target

//Objective-C exposes API for Swift through <target_name>-Bridging-Header.h
.swift uses .h.m = Swift consumer, Objective-C producer = <target_name>-Bridging-Header.h

//Swift exposes API for Objective-C through <target_name>-Swift.h
.h.m uses .swift = Objective-C consumer, Swift producer = <target_name>-Swift.h

Swift consumer, Objective-C producer

  1. Add a new header .h and Implementation .m files - Cocoa class file(Objective-C)
    For example <MyFileName>.h and <MyFileName>.m

  2. Configure bridging header
    When you see Would you like to configure an Objective-C bridging header click - Yes

    • <target_name>-Bridging-Header.h will be generated automatically
    • Build Settings -> Objective-C Bridging Header(SWIFT_OBJC_BRIDGING_HEADER)
  3. Add Class to Bridging-Header
    In <target_name>-Bridging-Header.h add a line #import "<MyFileName>.h"

After that you can use from Swift Objective-C's MyFileName.h,MyFileName.m

P.S. If you should add an existing Objective-C file into Swift project add Bridging-Header.h beforehand and import it

Objective-C consumer, Swift producer

  1. Add a <MyFileName>.swift and extends NSObject

  2. Import Swift Files to ObjC Class
    Add #import "<target_name>-Swift.h" into your Objective-C file

  3. Expose public Swift code by @objc [About]

After that you are able to use from Objective-C Swift's <MyFileName>.swift

[<product_name>-Swift.h file not found]

Different Targets [.modulemap] and [umbrella.h] are used for exposing Objective-C for Swift. And Swift.h for exposing Swift code for Objective-C

[Vocabulary]

mfaani
  • 33,269
  • 19
  • 164
  • 293
yoAlex5
  • 29,217
  • 8
  • 193
  • 205
16

Just a note for whoever is trying to add an Objective-C library to Swift: You should add -ObjC in Build Settings -> Linking -> Other Linker Flags.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
david72
  • 7,151
  • 3
  • 37
  • 59
14

After you created a Bridging header, go to Build Setting => Search for "Objective-C Bridging Header".

Just below you will find the ""Objective-C Generated Interface Header Name" file.

Import that file in your view controller.

Example: In my case: "Dauble-Swift.h"

eEter image description here

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Avijit Nagare
  • 8,482
  • 7
  • 39
  • 68
9

Click on the New file menu, and chose file select language Objective. At that time it automatically generates a "Objective-C Bridging Header" file that is used to define some class name.

"Objective-C Bridging Header" under "Swift Compiler - Code Generation".

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Yogesh shelke
  • 438
  • 4
  • 12
7

In the Swift 4.2.1 project in Xcode 10.1 you can easily add Objective-C file. Follow the steps below to bridge Objective-C file to Swift project.

Step_01: Create new Xcode project using Swift language:

File > New > Project > objc.

Step_02: In Swift project add new Objective-C file:

File > New > File... > macOS > Objective-C File.

Step_03: If you add a new Objective-C file into Swift project at very first time, Xcode asks you:

Would you like to configure an Objective-C bridging header?

enter image description here

Step_04: Select the option:

Create Bridging Header.

Step_05: A corresponding file will be generated with a name:

Objc-Bridging-Header.h.

enter image description here

Step_06: Now, you need setup Bridge file path in bridge header. In Project Navigator click on project with name objc and then choose:

Build Settings > Objective-C Bridging Header > Objc-Bridging-Header.h.

Step_07: Drag-and-drop your Objc-Bridging-Header.h into that box to generate a file path.

enter image description here

Step_08: Open your Objc-Bridging-Header.h file and import the Objective-C file which you want to use in your Swift file.

#import "SpecialObjcFile.m"

Here's a content of SpecialObjcFile.m:

#import <Foundation/Foundation.h>

@interface Person: NSObject {
@public
    bool busy;
}
@property
    bool busy;
@end

Step_09: Now in your Swift file, you can use an Objective-C class:

override func viewDidLoad() {
    super.viewDidLoad()
    let myObjcContent = Person()
    print(myObjcContent.busy)
}

enter image description here enter image description here

Andy Jazz
  • 49,178
  • 17
  • 136
  • 220
6
  1. Create a .h file from NewFile -> Source -> header file
  2. Then save the name of file Your_Target_Name-Bridging-Header.h People here gets common mistake by taking their project name but it should be the Project's Target's name if in case both are different, generally they are same.
  3. Then in build settings search for Objective-C Bridging Header flag and put the address of your newly created bridging file, you can do it right click on the file -> show in finder -> drag the file in the text area then the address will be populated.
  4. Using #import Your_Objective-C_file.h
  5. In the swift file you can access the ObjC file but in swift language only.
Saurabh Bhandari
  • 2,438
  • 4
  • 26
  • 33
Nish
  • 183
  • 4
  • 13
3

Two ways approach to use objective-c to code in Swift

1

1. Create bridge-header.h file in Xcode Project
2. import .h file in bridge-Header file
3. Set path of bridge-Header in Build settings. 
3. Clean the Project 

2

  1. Create objective-c files in project(it automatically set path in Build Settings for you )
  2. import .h file in bridge-Header file
Sanjay Mali
  • 506
  • 6
  • 13
3

Logans answer works fine except in latest Swift 5 it gives some compiler error. Here is the fix for people who are working on Swift 5.

Swift 5

import Foundation

class MySwiftObject : NSObject {

    var someProperty: AnyObject = "Some Initializer Val" as AnyObject

    override init() {}

    func someFunction(someArg:AnyObject) -> String {
        let returnVal = "You sent me \(someArg)"
        return returnVal
    }
}
Community
  • 1
  • 1
Sazzad Hissain Khan
  • 37,929
  • 33
  • 189
  • 256
3

Making any Swift class subclass of NSObject makes sense also I prefer for using any Swift class to be seen in Objective-C classes like:

@objc(MySwiftClass)
@objcMembers class MySwiftClass {...}
roadRunner
  • 173
  • 1
  • 23
2

Apple has provided official guide in this doc: how-to-call-objective-c-code-from-swift

Here is the relevant part:

To import a set of Objective-C files into Swift code within the same app target, you rely on an Objective-C bridging header file to expose those files to Swift. Xcode offers to create this header when you add a Swift file to an existing Objective-C app, or an Objective-C file to an existing Swift app.

If you accept, Xcode creates the bridging header file along with the file you were creating, and names it by using your product module name followed by "-Bridging-Header.h". Alternatively, you can create a bridging header yourself by choosing File > New > File > [operating system] > Source > Header File

Edit the bridging header to expose your Objective-C code to your Swift code:

  1. In your Objective-C bridging header, import every Objective-C header you want to expose to Swift.
  2. In Build Settings, in Swift Compiler - Code Generation, make sure the Objective-C Bridging Header build setting has a path to the bridging header file. The path should be relative to your project, similar to the way your Info.plist path is specified in Build Settings. In most cases, you won't need to modify this setting.

Any public Objective-C headers listed in the bridging header are visible to Swift.

Tibin Thomas
  • 1,365
  • 2
  • 16
  • 25