gpt4 book ai didi

objective-c - Objective-C 类中的 Swift 协议(protocol)

转载 作者:IT老高 更新时间:2023-10-28 11:48:02 26 4
gpt4 key购买 nike

我用 Swift 编写了 SearcherProtocol,需要实现一个 Objective-C 类 FileSearcher 必须使用这个协议(protocol)。

所以我尝试了这个:

#import <Foundation/Foundation.h>

@interface FileSearcher : NSObject <SearcherProtocol>

// ... class content

@end

编译器告诉我

Cannot find protocol declaration for 'SearcherProtocol'

相应的桥接头文件(modulename-Swift.h)正在FileSearcher.m中导入。

SearcherProtocol 导入 FileSearcher.h 会引发另一个编译器错误:module name-swift.h file not found

有人知道我做错了什么吗?

我正在使用 Xcode 6 Beta 5。

编辑

这是 Swift 中的协议(protocol)声明:

@objc protocol SearcherProtocol
{
var searchNotificationTarget: SearchCompletedProtocol? { get }
var lastSearchResults: [AnyObject] { get set }

func search(searchParam: String, error: NSErrorPointer) -> Bool
}

还有 SearchCompletedProtocol:

@objc protocol SearchCompletedProtocol
{
func searchCompletedNotification(sender: AnyObject!)
}

最佳答案

发生这种情况有两个常见原因:

  1. 模块名称错误,请参阅我的回答。
  2. 有一个循环引用 - 请参阅下面的 mitrenegades 答案。

1.正确获取模块名称:

如果 swift 协议(protocol)和 Objective C 都在同一个项目中,那么根据 apple您只需要确保获得正确的模块名称即可。

对于 Xcode6 beta 5,您可以在 BuildSettings->Packaging->Product Module Name 下找到它

一个常见的错误是认为每个 swift 文件/类都有自己的文件,但实际上它们都放在一个大文件中,即项目的名称。

另一个错误是如果模块名称有空格,这些应该用下划线替换。

编辑:

使用您的协议(protocol),我创建了一个名为“Test”的测试项目,它可以完美编译并且包含文件:

TestObjClass.h

#import <Foundation/Foundation.h>
#import "Test-Swift.h"

@interface TestObjCClass : NSObject <SearcherProtocol>

@end

TestObjClass.m

#import "TestObjCClass.h"


@implementation TestObjCClass

@end

TestProtocol.swift

import Foundation

@objc protocol SearcherProtocol
{
var searchNotificationTarget: SearchCompletedProtocol? { get }
var lastSearchResults: [AnyObject] { get set }

func search(searchParam: String, error: NSErrorPointer) -> Bool
}

@objc protocol SearchCompletedProtocol
{
func searchCompletedNotification(sender: AnyObject!)
}

<强>2。避免循环引用:

Mitrenegades 的回答解释了这一点,但如果您的项目需要使用使用 swift 协议(protocol)的显式 objc 类(而不仅仅是使用协议(protocol)),那么您将遇到循环问题。原因是 swift 协议(protocol)被定义到 swift-objc header ,然后定义到您的 obj-c 类定义,然后再到 swift-objc header 。

Mitrenegades 的解决方案是使用objective-c 协议(protocol),是一种方法,但如果你想要一个swift 协议(protocol),那么另一种方法是重构代码以便不直接使用objective-c 类,而是使用协议(protocol)(例如一些基于协议(protocol)的工厂模式)。无论哪种方式都可能适合您的目的。

关于objective-c - Objective-C 类中的 Swift 协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25266137/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com