16 Replies
      Latest reply on Mar 3, 2020 1:55 PM by eskimo
      ace.neerav Level 1 Level 1 (0 points)

        I read the article here... https://developer.apple.com/documentation/swift/imported_c_and_objective-c_apis/importing_swift_into_objective-c

        and this is what I did.

         

        1. Created a header file for swift file.
        2. added @class SwiftFile.h
        3. #import MyAppTargetName-Swift.h in the objc file from where I want to reference my swift code.

        Now in my swift file when I write...

         

        @interface ClassName
        {
        MySwiftClass *swiftClass;
        }
        
        

        I get error message Unknown Type Name "MySwiftClass".

         

        How can I resolve this and get going?

        Am I doing something wrong?

        Does the bridging header i created along with the swift file need to me edited?

         

        Neerav

        • Re: Call swift code from objc code in objc project
          ace.neerav Level 1 Level 1 (0 points)

          The bridging header generated is empty by default.

          • Re: Call swift code from objc code in objc project
            PBK Level 7 Level 7 (3,555 points)

            Do you realize you posted this in the Objective-C forum rather than the Swift forum? 

            • Re: Call swift code from objc code in objc project
              eskimo Apple Staff Apple Staff (13,385 points)

              Did you declare MySwiftClass as @objc?

              Share and Enjoy

              Quinn “The Eskimo!”
              Apple Developer Relations, Developer Technical Support, Core OS/Hardware
              let myEmail = "eskimo" + "1" + "@apple.com"

                • Re: Call swift code from objc code in objc project
                  ace.neerav Level 1 Level 1 (0 points)

                  Here are the steps i took after reading your last answer and the article on importing swift code into objective.

                   

                  1. created a header file for swift fle
                  2. included @class className in it
                  3. included #import "AppName-Swift.h"
                  4. Compiler gave error saying swift language version needs to be set in build settings. rectified it.

                  No w I get unknown type name on trying to define a pointer to the swift class.

                    • Re: Call swift code from objc code in objc project
                      ace.neerav Level 1 Level 1 (0 points)

                      do i need to reference the class in swift from my objective c .m file or should i using objc code itself.

                      • Re: Call swift code from objc code in objc project
                        eskimo Apple Staff Apple Staff (13,385 points)

                        I’m honestly not sure how you managed to get into the state you’ve got into.  It’s hard to debug such problems without having access to your project.  As an alternative, I’ve included working instructions below.  Please try repeating this at your end.  That’ll help in one of two ways:

                        • If they don’t work, there’s something wonky in your environment.

                        • If they do work, you have a working example that you can compare against your main project.


                        Here’s what I did:

                        1. In Xcode 11.3, I created a new app from the macOS > App template.  I named it MyApp, set the language to Objective-C, and the UI to Storyboard.

                        2. In the Project navigation on the left, I selected main.m and then chose File > New > File.

                        3. I selected the macOS > Swift template and named the file MySwiftClass.swift.

                        4. After saving the file, Xcode asked me whether I wanted to create a bridging header.  I clicked Create Bridging Header.  This isn’t necessary for this task, but you’ll likely need it later and it’s best to do it at this point.

                        5. I change MySwiftClass.swift to look like this:

                          import Foundation
                          
                          
                          @objc
                          class MySwiftClass: NSObject {
                          
                          
                          @objc
                          func run() {
                              print("MySwiftClass.run \(Date())")
                          }
                          }

                          .

                        6. In the Project navigation on the left, I selected main.m again.

                        7. I added this line after the existing #import:

                          #import "MyApp-Swift.h"

                          .

                        8. Inside the @autoreleasepool I added this code:

                          MySwiftClass * obj = [[MySwiftClass alloc] init];
                          [obj run];

                          .

                        9. I ran the app.  It printed:

                          MySwiftClass.run 2020-02-20 10:37:03 +0000

                          .

                        Share and Enjoy

                        Quinn “The Eskimo!”
                        Apple Developer Relations, Developer Technical Support, Core OS/Hardware
                        let myEmail = "eskimo" + "1" + "@apple.com"

                          • Re: Call swift code from objc code in objc project
                            ace.neerav Level 1 Level 1 (0 points)

                            Except for adding objc to the function call also (which i didnt make a call to yet), I did the same thing.

                             

                            Now xcode is giving me a different error.

                             

                            where I have written

                             

                            MySwiftClass *ptr;
                            ptr = [[MySwiftClass allo]init];
                            
                            

                            I get errory saying no init found. here is my class...

                             

                            //
                            //  StoreObserver.swift
                            //  Step Goals
                            //
                            //  Created by Neerav Kothari on 18/02/20.
                            //  Copyright © 2020 Neerav Kothari. All rights reserved.
                            //
                            
                            import Foundation
                            import StoreKit
                            
                            @objc class StoreObserver: NSObject, SKPaymentTransactionObserver {
                            
                                //Initialize the store observer.
                                @objc override init() {
                                    super.init()
                                    //Other initialization here.
                                }
                            
                                //Observe transaction updates.
                                @objc func paymentQueue(_ queue: SKPaymentQueue,updatedTransactions transactions: [SKPaymentTransaction]) {
                                    //Handle transaction states here.
                                }
                            
                            }
                            
                            

                             

                            This code is actually from a in-app purchase documentation which has a bug and it wont load the objc code.

                             

                            Now what can I do so that it finds init.

                             

                            I dont know swift.