【问题标题】:How to access swift class in objective-c file如何在objective-c文件中访问swift类
【发布时间】:2016-04-25 03:41:12
【问题描述】:

我有一个 swift 项目,我在项目中导入了一个单例、objective-c 编码的类。

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

我如何访问那个单例类中的 swift 类?

【问题讨论】:

标签: ios objective-c iphone swift swift2


【解决方案1】:

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

要在 Objective C 中使用 Swift 类,请按照给定的步骤操作:

  1. 创建一个名为 User 的 Objective C 类。
  2. 弹出显示“您想配置一个 Objective-C 桥接头”。选择创建桥接头

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. 在您的 .swift 类中的类名前面添加 @objc

     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. 转到构建设置。

  3. 设置产品模块名称:项目名称

  1. 设置定义模块:是

  1. 设置 嵌入内容包含 Swift:是

  1. 设置安装 Objective-C 兼容性标头:是

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

  1. 在您的 *.m 文件中导入自动生成的标题“ProjectName-swift.h”。
  2. 清理并运行您的项目。
  3. 它会起作用的!!!

关注Mix and Match 的 Apple 链接了解详细信息。

【讨论】:

  • 问题是关于在仅使用 Swift 制作的项目中使用 Objective-C 类。
  • @EugeneDubinin :谢谢提醒我。在 Swift 中开发项目时,我更新了我对 Objective C 中用户 Swift 文件的回答。谢谢
【解决方案2】:

在 Objective-C 中使用 Swift 类非常简单。只需按照下面给出的步骤

  • 打开您的 Objective-C 项目。
  • 向项目中添加一个新的 swift 文件。
  • 将打开一个默认对话框以创建桥接头(如果它
    默认不打开,添加桥接头文件)。
  • 转到构建设置类型 Swift Compiler,您将看到 Your ProjectName-Swift.h 在 Swift Compiler-General 中,如下所示

  • 导入您想要的快速类构建和运行。

【讨论】:

  • 感谢您的回答帮助我解决了我的问题。
【解决方案3】:

将多个 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 中,在 Build Settings 下,Swift-Compiler General 你应该看到这两个设置:

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

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

6. 在目标SwiftToObjC中,在Build Settings下,Define Module设置为YES。

  1. 如果你想在 MyViewController 中访问 Class1,那么在 MyViewController.m 中,你应该导入。

#import "SwiftToObjC-Bridging-Header.h"

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

@objc 公共类 Class1: UITableViewController

注意:UITableViewController 只是一个示例,用于演示目的。

就是这样。

【讨论】:

猜你喜欢
  • 2020-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多