如何在Objective-C文件中访问Swift类

6

我有一个Swift项目,并在项目中导入了一个Objective-C编写的单例类。

我尝试导入productname_swift.h文件,但没有成功。

如何在该单例类中访问Swift类?


请参考以下链接:https://dev59.com/b2Af5IYBdhLWcg3w9mps - technerd
5
可能是如何从Swift调用Objective-C代码的重复问题。 - Peter Hornsby
答案已更新,使用 Swift 类在 Objective C 中实现。 - technerd
3个回答

5

使用Swift类在Objective-C中:项目制作

要在Objective-C中使用Swift类,请按照以下步骤操作:

  1. 创建一个名为User的Objective-C类。
  2. 弹出显示“是否配置Objective-C桥接头文件”的窗口。选择创建桥接头文件

enter image description here

User.h

#import <Foundation/Foundation.h>

@interface User : NSObject

+(id) sharedUser ;

@end

User.m

#import "User.h"
#import "SwiftInObjectiveC-swift.h"


@implementation User


//Singleton of User

+(id)sharedUser{

    static User *sharedUser = nil;
    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        sharedUser = [[self alloc] init];

        //Class Method of ViewController.swift
        [ViewController mySwiftClassFunction];


        //Instance Method of ViewController.swift
        ViewController *vc = [[ViewController alloc] init];
        [vc mySwiftFunction];

    });
    return sharedUser;
}

-(void) myObjcectivecMethod {

    ViewController *vc = [[ViewController alloc] init];
    [vc mySwiftFunction];

}
  1. Add @objc in your .swift class in front of Class name.

     import UIKit
    
     @objc class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    func mySwiftFunction() {
    
        print("Swift Function")
    }
    
    class func mySwiftClassFunction (){
    
        print("Swift Class Function")
    
    }
    
    }
    
  2. Go to Build Settings.

  3. Set Product Module Name : ProjectName

图片描述

  1. 设置 Defines Module : YES

图片描述

  1. 设置 Embedded Content Contains Swift : YES

图片描述

  1. 设置 Install Objective-C Compatibility Header : YES

图片描述

  1. 设置 Objective-C Bridging Header : SwiftInObjectiveC/SwiftInObjectiveC-Bridging-Header.h

图片描述

  1. 在你的*.m文件中导入自动生成的头文件 "ProjectName-swift.h"。
  2. 清理并运行你的项目。
  3. 它将正常工作!!!

详细信息请参阅苹果链接 Mix and Match

图片描述


这个问题是关于在完全使用Swift的项目中使用Objective-C类的。 - Yevhen Dubinin
@EugeneDubinin:谢谢你提醒我。我已经更新了我的回答,针对在Swift中开发的项目中使用Objective C文件的用户。谢谢。 - technerd

3

在Objective-C中使用Swift类非常简单,只需按照以下步骤操作:

  • 打开您的Objective-C项目。
  • 向项目添加一个新的Swift文件。
  • 将自动打开一个默认对话框以创建桥接头文件(如果不是默认情况,请添加桥接头文件)。
  • 进入构建设置,输入“Swift Compiler”,您会在Swift Compiler- General中看到您的ProjectName-Swift.h,如下图所示: enter image description here

  • 导入您所需的Swift类,然后构建和运行。


谢谢伙计,你的答案帮助我解决了问题。 - Wilson

-1

将多个Swift文件添加到Objective-C项目中。

假设您想要将Class1.swiftClass2.swiftClass3.swift文件添加到SwiftToObjC项目中

  1. Class1.swift文件添加到项目中。

  2. XCode会问“是否要配置Objective-C桥接头文件”?您选择“创建桥接头文件”。因此,生成了SwiftToObjC-Bridging-Header.h文件以及SwiftToObjC-Swift.h文件。
  3. 在SwiftToObjC-Bridging-Header.h文件中添加以下行

@class Class1;

  1. 当您将Class2.swiftClass3.swift添加到项目中时,您还需要将这两个类添加到SwiftToObjC-Bridging-Header.h文件中,如下所示。

@class Class1;

@class Class2;

@class Class3;

5. 在目标SwiftToObjC下,进入构建设置Swift编译器常规,您应该看到这两个设置:

Objective-C桥接头文件 -> SwiftToObjC-Bridging-Header.h

Objective-C生成的接口头文件名称 -> SwiftToObjC-Swift.h

6. 在目标SwiftToObjC下,进入构建设置,将定义模块设置为YES。

  1. 如果您想在MyViewController中访问Class1,则应在MyViewController.m中导入。

#import "SwiftToObjC-Bridging-Header.h"

  1. 在您的Class1.swift文件中,将您的类声明为“@objc public”,如下所示。 Class2和Class3也使用相同的@objc public。

@objc public class Class1: UITableViewController

请注意:UITableViewController仅用于演示目的。

就这些。


我的理解是关键是“-Swift.h”文件。编译器会创建此文件,如此处所述:https://dev59.com/vmAf5IYBdhLWcg3w_G2r#24087280 并且正如其中一条评论所述,在此处:http://ericasadun.com/2014/08/21/swift-calling-swift-functions-from-objective-c/“-Bridging-Header.h”文件包含应向Swift公开的标头,而不是相反。 - easytarget

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接