在Swift中实现Objective C委托

问题描述 投票:1回答:2

我有一个Objective C类,其方法如下所示:

@class Client;

@protocol ClientDelegate <NSObject>

@optional
-(void) receivedMessageFromClient : (id) message;

@end

@interface Client : NSObject 

+(id) setup; 
 @property(nonatomic, strong) id <ClientDelegate> clientDelegate;

// more method declarations below

我正在我的Swift类中实现ClientDelegate,如下所示:

class HomeViewController: UIViewController, ClientDelegate {
    var client : AnyObject?
    var delegate: ClientDelegate?

    override func viewDidLoad() {
        super.viewDidLoad()

        client = Client.setup() as! Client
         client.clientDelegate = self
    }

func receivedMessageFromClient(message: AnyObject) {
        print("Message recieved: \(message)")
    }
}

这给了我一个编译错误:

无法分配属性:'self'是不可变的

当我删除线条

client = Client.setup() as! Client
client.clientDelegate = self

代码编译并调用Client类中的方法,该方法又将消息发送到receivedMessageFromClient,但该方法不在HomeViewController中调用。除了将self指定为委托之外,似乎所有设置都已设置。

objective-c swift swift-protocols
2个回答
7
投票

查看我对您的问题的评论,但这是在Swift中实现的Objective-C委托的基本示例:

Objective-C的:

@protocol MyDelegate <NSObject>

@optional
- (void)canImplementThis:(int)aVar;
@required
- (BOOL)needToImplementThis;

@end

@interface MyClass : NSObject

@property (nonatomic, weak) id<MyDelegate> delegate;

@end

迅速:

class SwiftClass : UIViewController, MyDelegate {

    var myObj : MyClass?

    override func viewDidLoad() {
        super.viewDidLoad()

        myObj = MyClass()
        myObj?.delegate = self
    }

    // MARK: - <MyDelegate>

    func canImplementThis(aVar : Int) {
        print("Called: \(aVar))
    }

    func needToImplementThis() -> Bool {
        return false
    }

}

原谅我输入的所有错别字直接进入SO。


0
投票

不得不出于某种原因将Int更改为Int32,因此它修复了无效的选择器问题,在快速端使用Int32但后来工作

© www.soinside.com 2019 - 2024. All rights reserved.