'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>
,但是对我来说打破了编译器。