从Objective C类调用Swift函数

时间:2014-06-06 09:06:23

标签: objective-c swift

我有问题。我有一个旧的Objective C项目,我想调用新的Swift函数和对象,我创建了文件“-Bridging-Header.h”和“-Swift.h”

我很容易将函数从Swift调用到Objective C,但我有一个反向问题。

所以我创建了一个简单的类“System.Swift”

import Foundation

@objc class System : NSObject {

@objc func printSome() {
    println("Print line System");
    }
}

现在我尝试按照文档here和< ...> -Swift.h文件中的内容编写了这个

@class System;

@interface System : NSObject

-(void)printSome;

@end

我已经在Objective C Class中导入了它。在我的Objective C Code的Objective C类(当前是UIViewController)中,我尝试调用“printSome”方法:

- (void)viewDidLoad
{
    [super viewDidLoad];
    System * sis = [[System alloc] init];
    [sis printSome];
    //any additional setup after loading the view from its nib.
}

现在我有以下错误:

  

架构i386的未定义符号:“_ OBJC_CLASS _ $ _ System”,   引自:         “ObjectiveC_Class_That_Call_Swift_Object”中的objc-class-ref .o ld:找不到架构i386 clang的符号:错误:链接器   命令失败,退出代码为1(使用-v查看调用)

有人可以帮助我吗?

关心所有。

9 个答案:

答案 0 :(得分:38)

问题已解决,我之前在名为.h Objective-C 类中创建并添加了一个新的<ProductModuleName>-Swift.h文件,但正如我后来发现的那样,此步骤不是必需的因为编译器会创建必要的文件不可见。

只需在您的课程中加入<ProductModuleName>-Swift.h即可。

答案 1 :(得分:33)

是的,谢谢

很奇怪,但它会起作用

1) Add @objc  to  Swift class

2) Add in .m 
    #import "(ProjectName)-Swift.h"

3) Call from .h
    @class SwiftClass;

4)On SwiftClass 
   click "Command" + Left Click (Apple Documantation)

5) To see "-Swift.h" -> click "Command" + Left Click

App将在-Swift.h中为该类生成接口

实施例:    SWIFT_CLASS( “_ TtC10Project17220PLHelper”) @interface PLHelper

  • (void)notifyForDownloading:(NSDictionary *)userInfo;
  • (instancetype)init OBJC_DESIGNATED_INITIALIZER; @end

答案 2 :(得分:26)

假设我们有ProjectName“MyFirstProjectOnSwift”和swift类名“mySwiftClass”,而objectiveC类是“MyObjectiveCLass”

以下步骤为: -

  
      
  1. 在“MyObjectiveCLass.m”中添加#import“MyFirstProjectOnSwift-Swift.h”

  2.   
  3. 在MyObjectiveCLass.h中添加@class mySwiftClass;

  4.   
  5. 然后在MyObjectiveCLass.m

    中      

    mySwiftClass * myClass = [mySwiftClass new]; {在任何人中都这样打电话   方法无论你想在哪里调用swift方法。}

  6.   
  7. [myClass methodName];

  8.   

答案 3 :(得分:9)

检查-swift.h文件,该文件在Objective-C:./ / p>中的.m文件中有导入

#import <YourProjectName-Swift.h>

单击该行,然后单击鼠标左键 - 跳转到定义。

此文件应自动包含,而不是手动包含。

答案 4 :(得分:2)

如果您在导入<ProductModuleName>-Swift.h后仍然没有看到您的课程。

确保您的类是子类化本机类(例如UIViewController),或者至少如果它只是一个实用程序类,请将其作为子类NSObject。你的班级现在应该展示。

答案 5 :(得分:0)

对于任何绊倒这篇文章的人和其他答案都没有用的小技巧:您可能还必须将Swift类声明为“ public”。

示例:

@objc public class MySwiftClass: NSObject {

答案 6 :(得分:0)

在从Obj-C迁移到Swift的项目上从Objective-C执行Swift代码的推荐方法是使用Bridge / Proxy模式。

  1. 实施桥梁。

import Foundation

@objc class AnalyticsPropertyBridge: NSObject {

private var analytics: AnalyticsManager = AnalyticsManager()

@objc func refreshProperties() {

    self.analytics.set(AnalyticsProperty.clientType)
}

}

  1. 在伞形文件(Bridging-Header)中包括objC调用者模块:

#import "CallerModule.h"

  1. 最后在调用者.m文件中,出现两个问题:

3.a导入伞形文件:

#import "MyProject-Swift.h"

3.b呼叫网桥。

[[AnalyticsPropertyBridge new] refreshProperties];

优点:因为从Objc调用了代码,所以@objc不会使您的快速代码变得肮脏。随着时间的流逝,ObjC将在您的项目中减少,最后新娘将被移除。

答案 7 :(得分:0)

关于项目名称的说明,如果项目名称中有空格,请务必用下划线替换,例如如果项目名称是“我的项目”,则需要包含:

#import <My_Project-Swift.h>

答案 8 :(得分:-1)

如果有人仍有问题,这里是一篇好文章。

Setting up Swift and Objective-C Interoperability

  1. 本文深入讨论了如何将Swift文件导入ObjC以及将Objc文件导入Swift。
  2. 它还解决了项目名称中有空格时通常会遇到的问题。
  3. 还讨论了“产品模块名称”标志。