Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.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,我尝试将名为AnalyticProtocol的Swift协议导入名为AnalyticFactory的Objective-C类 protocol AnalyticProtocol { } 我从一个现有的Objective-C项目开始(我没有用xCode创建新的Swift项目,也没有找到如何在xCode 6中将我的Objective-C项目配置为Swift项目) 在我的Swift文件中,我包含了名为MyProjectName Swift.h的.h文件,但编译器返回一个错误,告诉我它不存在。 因此

我尝试将名为
AnalyticProtocol
的Swift协议导入名为
AnalyticFactory
的Objective-C类

protocol AnalyticProtocol
{

}
我从一个现有的Objective-C项目开始(我没有用xCode创建新的Swift项目,也没有找到如何在xCode 6中将我的Objective-C项目配置为Swift项目)

在我的Swift文件中,我包含了名为
MyProjectName Swift.h
.h
文件,但编译器返回一个错误,告诉我它不存在。 因此,我创建了一个名为
MyProjectName Swift.h
.h
文件,它实际上是空的(我不知道应该在里面放什么)

在报告中,他们说我必须在我的
.m
文件中包含名为
MyProjectName Swift.h
.h
文件。但是我不需要将它包含到我的
.m
文件中,而是要包含到我的
.h
中。这会有问题吗

尝试编译时出现以下错误::0:error:xxxAnalyticFactory.h:39:找不到“AnalyticProtocol”的协议声明

以及被指控的法典:

@interface AnalyticFactory : NSObject
{
    Class<AnalyticProtocol> _analyticProtocolClass; // The type of the analytic class currently used.
}
@接口分析工厂:NSObject
{
Class _analyticProtocolClass;//当前使用的分析类的类型。
}
我想我不太明白如何将Swift协议导入Objective-C类


有人看到我在做什么时出错了吗?

您需要将
@objc
属性添加到您的Swift协议中,如下所示:

@objc protocol AnalyticProtocol {

}

对于任何只需要采用协议的人,您可以分两步执行,而不产生任何警告或错误:

  • .swift
    文件中,在协议名称之前添加
    @objc

    @objc protocol AnalyticProtocol {
    
    }
    
  • .m
    文件中,导入生成的Swift头并采用私有类别中的协议。(头文件自动命名):

    #导入“ProductModuleName Swift.h”
    
    @接口分析工厂()

    无法在objC头文件中导入Xcode生成的Swift头

    因此,由于要在objC头文件中使用Swift代码,因此需要“前向声明”要在objC头文件中使用的类和协议,如下所示:

    @protocol AnalyticProtocol;
    
    现在,您可以在objC类声明中使用该协议:

    @interface AnalyticFactory : NSObject
    {
        Class<AnalyticProtocol> _analyticProtocolClass; // The type of the analytic class currently used.
    }
    
    @接口分析工厂:NSObject
    {
    阶级


    请注意,当您使用前向声明的协议(“找不到'AnalyticProtocol'的协议定义”)时,XCode将在objC头文件中发出警告,但这是可以忽略的-实现将在编译时找到。

    如果您正在创建框架,则需要导入

    #import "ProductModuleName-Swift.h"
    
    更改:

    #import <ProductModuleName/ProductModuleName-Swift.h>
    

    我们可以在Objective C中使用swift协议,只需对代码进行少量更改。此外,@objc声明的协议允许您在没有默认实现的情况下使用可选和必需的方法。它有其优点和缺点

    在Objective C中使用时,我们实际上可以将协议名称重新命名为更具描述性的名称。我使用了“@objc(alias_name)”

    这是密码, 让我们在objc代码中使用一个带有@objc属性和别名的swift协议

    @objc(ObjTableViewReloadable) protocol TableViewReloadable: class {
       func reloadRow(at index: IndexPath)
       func reloadSection(at index: Int)
       func reloadTable()
    }
    
    现在让farword在.h文件中声明我们的协议

    @protocol ObjTableViewReloadable;
    
    现在,您可以在.m文件中遵守此协议,并添加所需的方法实现

    #import "MyApp-Swift.h"
    @interface MyObjcViewController () <ObjTableViewReloadable>
    
    #导入“MyApp Swift.h”
    @接口MyObjcViewController()
    
    查看WWDC 2014的视频。在视频的30:40左右,他们描述了如何在Objective-C类中访问Swift协议。感谢您的回答,但问题仍然存在。您可以发布一个重现该问题的示例项目吗?添加@objc有助于我将Swift类导入Obj-C@objc不总是有效的。遵守协议时,有时在
    .h
    文件中的
    @接口
    上添加协议时,它不起作用。但是,您可以将协议添加到
    .m
    文件中的私有
    @接口
    ,它会修复问题(至少有时对我来说是这样)因此,在您的
    @实现
    上面有
    @接口MyController()
    。有时候,当您编辑时,Xcode 8会抱怨,但是当您实际构建它时,按照这个答案和注释,错误就会消失。为什么Xcode在编译并正常工作时会显示缺少协议的警告?有没有办法删除警告?仍然无法在此类上调用协议方法尽管如此。它将为选择器提供错误
    无可见@interface
    ,并生成以下警告:“找不到xxxx的协议定义“我仍然收到警告,无论是否有转发声明。我正在扩展中使用协议。这对我有效;此页面上的其他建议或答案无效。我使用Swift 4。这是删除警告的唯一方法(即使协议位于头文件中时也有效)这确实为我消除了警告,但编译时出现了错误,因为使用采用swift协议的ObjC文件的swift类看不到ObjC文件采用了该协议!同样的链接可通过WebArchive获得:感谢您发布此消息。我正在查看比dirt更旧的遗留代码,如果这符合ach有效,它会帮我省去很多痛苦。:)
    @protocol ObjTableViewReloadable;
    
    #import "MyApp-Swift.h"
    @interface MyObjcViewController () <ObjTableViewReloadable>