我正在编写一些基于我们的 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/