从 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()
}
}
我正在编写一些 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()
}
}