从Objective C类调用Swift函数

Elo*_*den 73 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");
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我已经尝试按照这里的文档和<...> - Swift.h文件内部写了这个

@class System;

@interface System : NSObject

-(void)printSome;

@end
Run Code Online (Sandbox Code Playgroud)

我已经在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.
}
Run Code Online (Sandbox Code Playgroud)

现在我有以下错误:

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

有人能帮帮我吗?

关心所有.

Elo*_*den 44

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

只需<ProductModuleName>-Swift.h在课堂上加入即可.

  • http://ericasadun.com/2014/08/21/swift-calling-swift-functions-from-objective-c/上的好例子 (4认同)
  • 带参数的函数怎么样? (3认同)
  • 我无法使用参数和返回值访问Swift函数,也无法在没有参数且没有返回值的情况下访问Swift函数.我不知道为什么.我的Swift类是一个NSObject,我导入了Foundation框架,类和函数都有`@ objc`前缀.`-Swift.h`已自动创建.令我头疼的是我可以调用Class本身,但不能调用其中的任何函数.有谁知道为什么? (2认同)
  • 它是`<productModuleName> - .Swift.h`(不是`model`). (2认同)
  • 如果您的产品名称中有任何空格,请将其替换为下划线,例如:`#import "My_Project-Swift.h"`。 (2认同)

Svi*_*ana 35

对了谢谢

这很奇怪,但它会起作用

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
Run Code Online (Sandbox Code Playgroud)

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

示例:SWIFT_CLASS("_ TtC10Project17220PLHelper")@interface PLHelper

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

  • 对于任何可能像我一样犯同样愚蠢错误的人.在第2步中,确保使用`(ProjectName)-Swift.h`,**NOT**`(ClassName)-Swift.h`! (11认同)

小智 29

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

以下步骤是: -

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

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

  3. 然后在MyObjectiveCLass.m中

    mySwiftClass*myClass = [mySwiftClass new]; {在任何想要调用swift方法的方法中都可以调用此类.}

  4. [myClass methodName];

  • mySwiftClass *myClass = [mySwiftClass new] 它对我不起作用&gt;&gt;&gt;&gt; (3认同)

Dar*_*kas 11

检查-swift.h文件,该文件在objective-C中的.m文件中有导入:

#import <YourProjectName-Swift.h>
Run Code Online (Sandbox Code Playgroud)

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

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


Kqt*_*qtr 6

对于任何偶然发现这篇文章以及其他答案不起作用的人来说,有一点额外的提示:您可能还必须声明您的 Swift 类为“public”。

例子:

@objc public class MySwiftClass: NSObject {