'SessionDelegate'没有名为'xxx'的成员

我以前问过关于如何使用可选方法创build协议的问题。 答案几乎是使用Objective-c。 在这里看到 。

我做了,一切正常,因为我正在使用

var delegate: SessionDelegate?; 

也就是说,“委托”是一个可选的SessionDelegate。 为了调用该委托的方法,我可以简单地写:

 self.delegate?.willOpenSession?(self); 

哪个很好 但是,然后我虽然,为什么使委托可选? 所以我改变了它:

 var delegate: SessionDelegate; 

显然,通话也改变了:

 self.delegate.willOpenSession?(self); 

问题是,这最后一行(和其他types)说:'SessionDelegate'没有名为'willOpenSession'的成员。 为什么这不工作?

这是我的代码:

SessionDelegate.h

 @class Session; @protocol SessionDelegate <NSObject> @optional - (BOOL)willOpenSession:(Session*)session; - (void)didOpenSession:(Session*)session; - (void)didFailOpenningSession:(Session*)session withError:(NSError*)error; - (BOOL)willCloseSession:(Session*)session destroyingToken:(BOOL)destroyingToken; - (void)didCloseSession:(Session*)session destroyingToken:(BOOL)destroyingToken; @end 

XXX桥接,Header.h

 #import <Foundation/Foundation.h> #import <FacebookSDK/FacebookSDK.h> #import "SessionDelegate.h" 

Session.swift

 import Foundation protocol Session { var delegate: SessionDelegate { get set }; var isOpen: Bool { get }; var isCached: Bool { get }; func open(); func close(); func destroy(); } 

FacebookSession.swift

 import Foundation class FacebookSession : Session { var delegate: SessionDelegate; var isOpen: Bool { get { return FBSession.activeSession().isOpen; } } // TODO var isCached: Bool { get { return false; } } init(delegate: SessionDelegate) { self.delegate = delegate; } func open() { if self.isOpen { return; } // Trigger the "will" event self.delegate.willOpenSession?(self); // Handle session state changes var completionHandler: FBSessionStateHandler = { session, status, error in if error { // Login failed for some reason, so we notify the delegate. // TODO we should turn this NSError message into something more generic (that is, not facebook specific) self.delegate.didFailOpenningSession?(self, withError: error); } else if status.value == FBSessionStateClosedLoginFailed.value { // Login failed with no error. I'm not sure this ever happens self.delegate.didFailOpenningSession?(self, withError: error); } else if status.value == FBSessionStateOpen.value || status.value == FBSessionStateOpenTokenExtended.value { // Session is now open, we should notify the delegate self.delegate.didOpenSession?(self); } else { // There's no error but the session didn't open either. I don't think this ever happens, but if it does, what should we do here? abort(); } }; // Open the session, prompting the user if necessary if FBSession.openActiveSessionWithReadPermissions([], allowLoginUI: true, completionHandler: completionHandler) { // If we end up here, the session token must exist, se we now have an open session self.delegate.d didOpenSession?(self); } } func close() { } func destroy() { } } 

最好的祝福。

编辑:我也试过以下

 self.delegate.willOpenSession?(self as Session); 

 self.delegate.willOpenSession(self as Session); 

两者都行不通。

编辑:毕竟,如果我使用它不起作用

 var delegate: SessionDelegate?; 

编辑:以前的更改也会更改错误消息。 现在我有可选的SessionDelegate(正如我在前面的编辑​​中所述)和以下行

 self.delegate?.willOpenSession?(self) 

说:“找不到会员'willOpenSession'”

你得到这个错误是因为你将Session定义为一个协议,但SessionDelegate协议中的Objective-C方法定义期望Session类或子类。 在Swift中,可以在方法定义中使用协议名称与类名称互换,但是在Objective-C中有一个区别:

 - (void)willOpenSession:(Session *)session; // expects instance of Session class or subclass - (void)willOpenSession:(id<Session>)session; // expects object conforming to Session protocol 

从你发布的代码,我不能告诉你为什么已经宣布Session作为协议 – 它是否添加function不同的类? 难道它是一个超类FacebookSession (大概是其他会话)只是inheritance? 将Session更改为一个类(并将方法存根)可以解决问题。 否则,你将需要改变你的SessionDelegate方法,期望一个id<Session> ,但是对我来说打破了编译器。