ios - 从 Swift 调用 Objective-C 委托(delegate)的方法

标签 ios objective-c swift delegates protocols

我正在编写一些基于我们的 objective-c 应用程序功能的 Swift 类。我有一个带有符合协议(protocol)的委托(delegate)的 objective-c 类。我正在尝试从 Swift 类内部调用该委托(delegate)的方法,我将其简化为这样。

FredTestProtocol.h:

@protocol FredTestProtocol
- (void) dumbMethod;
@end

FredTestClass.h:

#import <Foundation/Foundation.h>
#import "FredTestProtocol.h"

@interface FredTestClass : NSObject <FredTestProtocol>
@property (nonatomic, weak) NSObject <FredTestProtocol> *delegate;
@end

FredTestClass.m:

#import "FredTestClass.h"

@implementation FredTestClass
- (void) dumbMethod
{
    NSLog(@"Boy, this is a dumb method");
}
@end

FredSwiftClass.swift

import Foundation

class FredSwiftClass {
    func test()
    {
        let ocObject = FredTestClass()
        ocObject.delegate.dumbMethod() // Error occurs here.
    }
}

指示的行产生错误“‘NSObject’没有名为‘dumbMethod’的方法”我已经尝试了很多方法来消除错误,但无济于事。我确定我错过了一些非常基本的东西。谁能告诉我应该如何从 Swift 调用委托(delegate)方法?

最佳答案

当 Swift 检查属性 delegate 时,它只是看到它是一个 NSObject 并且您已经注意到它实现了一个协议(protocol)的事实被忽略了。我找不到任何具体的文档来说明为什么会这样。

您可以通过多种方式解决这个问题。

首先,您可以重新定义您的 delegate 属性以使用类匿名性,然后 Swift 会将其视为实现协议(protocol)的某个对象 -

FredTestClass.h

#import <Foundation/Foundation.h>
#import "FredTestProtocol.h"

@interface FredTestClass : NSObject <FredTestProtocol>
@property  id<FredTestProtocol> delegate;
@end  

然后您的 Swift 代码将按照编写的方式进行编译。

或者您可以保留您的委托(delegate)定义并告诉 Swift 您希望将委托(delegate)作为通过向下转换实现协议(protocol)的对象的实例来访问 -

FredTestSwift.swift

import Foundation

class FredSwiftClass {
    func test()
    {
        let ocObject = FredTestClass()
        let theDelegate=ocObject.delegate as! FredTestProtocol
        theDelegate.dumbMethod()
    }
}

关于ios - 从 Swift 调用 Objective-C 委托(delegate)的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30632284/

相关文章:

objective-c - 在 xcode 的公式中使用 sin()

iphone - 点击覆盖时显示标注

iphone - 使用 NSLog 打印 NSData

swift - 快速子类化 UIView

json - Swift 解析使用 1 个 url api 解码 2 个不同的 json

ios - AVMutableComposition 没有正确定位视频

objective-c - UITableView 被 UITabBar 部分隐藏

ios - 如何等待 findObjectsInBackgroundWithBlock(在 Parse 中)完成然后运行 ​​MainThread?

ios - GPPSignIn 共享实例 -> EXC_BAD_ACCESS(代码 = EXC_I386_GPFLT)

ios - UITextField 不显示键盘