从 Swift 调用 Objective-C 委托的方法

Calling a Method on an Objective-C Delegate from Swift

我正在编写一些 Swift classes,它们建立在我们 objective-c 应用程序的功能之上。我有一个 objective-c class 和一个符合协议的委托。我正在尝试从 Swift class 内部调用该委托的方法,我将其简化为这个。

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 调用委托方法吗?

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

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

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

FredTestClass.h

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

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

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

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

FredTestSwift.swift

import Foundation

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

我确定我知道了。

func test()
{
    let ocObject = FredTestClass()

    if let myDelegate = ocObject.delegate as? FredTestProtocol
    {
        myDelegate.dumbMethod()
    }
}