【问题标题】:Trying to use a delegate method written in Objective-C in Swift is throwing "Cannot find protocol Declaration"尝试在 Swift 中使用用 Objective-C 编写的委托方法会抛出“找不到协议声明”
【发布时间】:2014-06-12 04:47:15
【问题描述】:

我有一个使用 Salesforce SDK 的现有示例 Objective-C 应用程序。我正在尝试将其转换为一次使用 Swift 一类。 Salesforce SDK 有一个名为“SFRestRequest.h”的类,它具有“SFRestDelegate”委托。

在Objective C 中,我有一个名为“RootViewController.h”的类,它是UITableViewController 的子类。它实现了 SFRestDelegate。它工作正常。

//RootViewController.h
#import <UIKit/UIKit.h>
#import "SFRestAPI.h"

@interface RootViewController : UITableViewController <SFRestDelegate> {

    NSMutableArray *dataRows;
    IBOutlet UITableView *tableView;    

}

我正在尝试创建一个 RootVC.swift 文件来替换 RootViewController Objective-c 类。

我有一个桥接头文件,可以导入所有在 Objective-c 中导入的标头

//SwiftForce-Bridging-Header.h 
#import "SFRestAPI.h"
#import "SFRestRequest.h"

我的 RooVC.Swift 文件如下所示:

import UIKit

class RootVC: UITableViewController,SFRestDelegate {
 ..
..
}

现在,如果我命令+单击 SFRestDelegate,它会正确执行协议。 但是,如果我尝试构建,我会得到..“找不到协议声明 SFRestDelegate 错误

SWIFT_CLASS("_TtC10SwiftForce6RootVC")
@interface RootVC : UITableViewController <SFRestDelegate>
@property (nonatomic) NSArray * dataRows;
- (instancetype)initWithStyle:(UITableViewStyle)style OBJC_DESIGNATED_INITIALIZER;
- (void)viewDidLoad;
- (void)didReceiveMemoryWarning;
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
@end

感谢任何帮助。您可以通过从以下位置下载应用程序来测试它: https://github.com/rajaraodv/SwiftForce

【问题讨论】:

  • MytDelegate 是错字吗?
  • 不。这只是我写这篇文章时的一个错字。

标签: swift


【解决方案1】:

我刚刚向您链接的存储库发送了一个拉取请求,它解决了问题。

您的问题似乎是 Swift 和 Objective-C 类和标头的加载顺序问题。您必须确保在编译 Swift 代码之前编译 Swift 类所需的任何头文件。这可以通过简单的 .h 和 .m Objective-C 文件无缝处理,但是当使用静态库(如在您的项目中)时,.pch 文件似乎是导入 Swift 代码在编译时需要的任何头文件的最合适位置时间。

将此行添加到您的 SwiftForce-Prefix.pch 文件似乎有效:

#import &lt;SalesforceNativeSDK/SFRestRequest.h&gt;

这看起来不是很优雅(就像 Bridging-Header 解决方案一样),但是只有时间才能证明这是一个错误还是最佳实践。

【讨论】:

  • 无耻的插件,如果这个答案对你有用:来加入我和我的几个学生一起冒险/对话,我们一起学习 swift:learnswift.io
  • 感谢 jonnyclem 的解决方案。对我来说,它看起来像是 bridging-header 中的一个错误,因为 bridging-header 应该按照我的理解来做那件事。至少我没有找到任何关于将它添加到 prefix.pch 文件的信息。再次感谢!顺便说一句,你的博客真的很酷!
  • 谢谢,这对我有用!只是给像我这样的人在项目中没有前缀文件的注释:您可以自己创建一个并在目标设置、构建设置、Prefix Header 中指定它。
  • 这感觉太糟糕了。这不正是桥接头应该处理的吗?不过,您的回答为我解决了问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-27
相关资源
最近更新 更多