Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Objective-C类调用Swift函数_Objective C_Swift - Fatal编程技术网

从Objective-C类调用Swift函数

从Objective-C类调用Swift函数,objective-c,swift,Objective C,Swift,我有一个旧的Objective-C项目,我想调用新的Swift函数和对象,我创建了文件“-bridgeing Header.h”和“-Swift.h” 对我来说,从Swift调用Objective-C函数很容易,但反向调用时我遇到了一个问题 所以我创建了一个简单的类“System.Swift” 现在我试着按照文档进行操作,并在-Swift.h文件中编写了这篇文章 @class System; @interface System : NSObject -(void)printSome; @e

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

对我来说,从Swift调用Objective-C函数很容易,但反向调用时我遇到了一个问题

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

现在我试着按照文档进行操作,并在
-Swift.h
文件中编写了这篇文章

@class System;

@interface System : NSObject

-(void)printSome;

@end
我已经在我的Objective-C类中导入了它。此时,在Objective-C代码的Objective C类(当前为UIViewController)中,我尝试调用“printSome”方法:

现在我有以下错误:

架构i386的未定义符号:“OBJC_类$\u系统”, 引用自: “ObjectiveC\u class\u调用\u Swift\u对象”中的objc类引用。o ld:未找到架构i386的符号clang:错误:链接器 命令失败,退出代码为1(使用-v查看调用)


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


只需将
-Swift.h
包含在你的课堂中,它就会起作用。

这很奇怪,但它会起作用

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
应用程序将在-Swift.h中生成该类的接口

例如: SWIFT类(“TtC10Project17220PLHelper”) @接口PLHelper

  • (void)notifyForDownloading:(NSDictionary*)userInfo
  • (instancetype)初始化对象指定的初始化器; @结束

检查-Swift.h文件,该文件在objective-C中的.m文件中具有导入功能:

#import <YourProjectName-Swift.h>
#导入
单击该行,然后左键单击-跳转到定义


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

假设我们有ProjectName“MyFirstProjectOnSwift”和swift类名“mySwiftClass”,Objective类为“MyObjectiveCLass”

以下步骤是:-

  • 在“MyObjectiveCLass.m”中添加#导入“MyFirstProjectsWift.h”

  • 在MyObjectiveCLass.h中添加@class myswitClass

  • 然后在MyObjectiveCLass.m中


    mySwiftClass*myClass=[mySwiftClass new];{在任何情况下都可以这样打电话 方法调用swift方法的任何位置。}

  • [myClass方法名]


  • 如果导入
    -Swift.h
    后仍然看不到类


    确保您的类是一个本机类的子类(例如
    UIViewController
    ),或者至少如果它只是一个实用程序类,则将其设为子类
    NSObject
    。你的课程现在应该显示出来了。

    对于任何在这篇文章上绊倒的人来说,没有什么额外的提示,对于hwhom来说,其他答案都不起作用:你可能还必须将你的Swift课程声明为“公共”

    例如:


    @objc公共类myswitclass:NSObject{

    在从Obj-C迁移到Swift的项目上,建议使用桥接/代理模式从Objective-C执行Swift代码

    private var analytics: AnalyticsManager = AnalyticsManager()
    
    @objc func refreshProperties() {
    
        self.analytics.set(AnalyticsProperty.clientType)
    }
    
  • 实施桥梁
  • 导入基础

    @objc类分析属性桥:NSObject{

    private var analytics: AnalyticsManager = AnalyticsManager()
    
    @objc func refreshProperties() {
    
        self.analytics.set(AnalyticsProperty.clientType)
    }
    
    }

  • 将objC调用方模块包括在伞形文件(桥接头)中:
  • #导入“CallerModule.h”

  • 最后,在caller.m文件中,有两个问题:
  • 3.导入伞式文件:

    #导入“MyProject Swift.h”

    b打电话到桥上去

    [[AnalyticsPropertyBridge新建]刷新属性];


    好处:您的swift代码不会被@objc弄脏,因为代码是从objc调用的。随着时间的推移,您的项目中的objc将减少,最后新娘将被删除。

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

  • 本文深入讨论了如何将Swift文件导入ObjC以及如何将ObjC文件导入Swift
  • 它还解决了当项目名称中有空格时通常面临的问题
  • 还讨论了“产品模块名称”标志

  • 关于项目名称的说明,如果项目名称中有空格,请确保将其替换为下划线,例如,如果项目名称为“我的项目”,则需要包括:

    #import <My_Project-Swift.h>
    
    #导入
    
    您有一个链接器错误。是:(1)Xcode在为您的Swift代码命名Objective-C桥接头和生成的头时使用您的产品模块名称而不是目标名称,还是(2)在将Swift生成的头导入到要从中访问Swift代码的Objective-C.m文件之前,请确保导入这些类型的Objective-C头?您的Objective-C代码中是否有:#导入“ProductModuleName Swift.h”?是的,我已经阅读了文档和“ProductModelName”的名称是currect…有一个bug,在构建设置中没有设置产品模型…我甚至设置了它…@petert你能更好地解释第二点吗?我写了所有我做的事情…问题解决了,我在我的项目调用中添加了一个新的.h文件-Swift.h,但这不是必需的,因为编译器只是创建了这个对象,即使我看不见它。我已经删除了我创建的新文件,现在运行得很好。Tnx petertYou可以回答您自己的问题-它可能会帮助其他人。带参数的函数如何?我无法访问带参数和返回值的Swift函数,也无法访问不带参数和返回值的Swift函数。我可以不知道为什么。我的Swift类是NSObjor,我导入了基础框架,类和函数有<代码> @ Objc前缀。<代码> -SWIFT.H./C>已经自动创建。令我头痛的是,我可以调用类本身,但里面没有任何函数。有人知道为什么吗?好例子。is
    -.Swift.h
    (非
    型号
    #import <My_Project-Swift.h>