- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我之前问过一个关于如何使用可选方法创建协议(protocol)的问题。答案几乎是使用 Objective-c。参见 here 。
我做到了,一切正常,因为我正在使用
var delegate: SessionDelegate?;
也就是说,“delegate”是一个可选的SessionDelegate。为了从该委托(delegate)调用方法,我可以简单地编写:
self.delegate?.willOpenSession?(self);
这很好。但后来我想,为什么让委托(delegate)成为可选的呢?所以我改变了它:
var delegate: SessionDelegate;
显然,调用也发生了变化:
self.delegate.willOpenSession?(self);
问题是,最后一行(以及任何其他类似行)表示:“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-Bridging-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
作为协议(protocol),但 Objective-C 方法定义在 SessionDelegate
协议(protocol)期待一个 Session
类或子类。在 Swift 中,您可以在方法定义中将协议(protocol)名称与类名称互换使用,但在 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
作为协议(protocol)——它是否为不同的类添加了功能?它可以代替 FacebookSession
的父类(super class)吗? (可能还有其他 session )只是继承自?改变 Session
到一个类(并 stub 方法)将解决这个问题。否则你需要改变你的 SessionDelegate
期待 id<Session>
的方法,但对我来说这破坏了编译器。
关于ios - 'SessionDelegate' 没有名为 'xxx' 的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24591921/
我从我的服务器获取此 IP,例如: "/177.127.101.68:53964" "/201.80.15.100:54263" "/177.67.38.54:51309" 我需要它就像“177.12
终端抛出此错误意味着什么以及如何解决它? packet_write_wait: Connection to xxx.xxx.xxx.xxx: Broken pipe 这是今天刚刚发生的事情。正常工作一
这应该是非常简单的,但我不能让它为我的生活工作。我只是想远程连接到我的MySQL服务器。。连接方式:。运作良好,但正在尝试:。失败,并显示以下错误:。错误1130(00000):不允许主机‘xxx.x
正在尝试将坞站映像推送到私有坞站存储库。但收到如下错误:“拨号tcp:lookup xxx.xxx:没有这样的主机”。我已正确登录到存储库,并且构建成功。。以下命令用于将映像推送到私有repo:sud
这个问题已经有答案了: Android 8: Cleartext HTTP traffic not permitted (37 个回答) 已关闭 3 年前。 这是 list 文件
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: A comprehensive regex for phone number validation 什么是正
尝试将 docker 镜像推送到私有(private) docker 存储库。但出现类似错误:“dial tcp:lookup xxx.xxx.xxx.xxx: no such host”。我已正确登
我搜索了 StackOverflow,并在尝试打开引用不同项目中的 UserControl 的表单时发现了类似的问题。 我明白 To prevent possible data loss before
我收到的错误是 com.sun.xml.ws.client.ClientTransportException: HTTP transport error: java.io.IOException: H
我需要用 preg_match 检查输入,它必须是这种格式:xxx.xxx.xxx block 的数量可以变化......这些都是有效输入的例子: 001 00a.00a 0fg.001 aaa.aa
在所有构建过程完成且没有任何错误后,我遇到了失败。 我不知道为什么会出现以下错误。 即使所有测试均已成功完成,此错误仍将作业状态标记为失败。致命:来自 socaautovm1.xxx.local/19
我有一个单独托管的 Postgres 数据库,我正试图将其与我的 Phoenix 应用程序一起使用。我的 prod 配置是: config :my_app, MyApp.Repo, adapter
我尝试使用 terraform 在 Azure 中创建负载均衡器,但收到此错误: Error: creating/updating Load Balancer "lbclassic" (Resourc
Java中是否有一个类可以让您将“102203345.32”之类的数字格式化为“102.203.345,32”并返回字符串类型? 我想获得一个字符串,其中千位由“.”分隔。小数点之间用逗号“,”分隔。
大家好,我已经通过大量在线编码来获取我的 android 手机 IP 地址大多数都以结尾 if (!inetAddress.isLoopbackAddress()) {
首先,我知道 this question .由于我既没有使用 maven 也没有使用 jenkins,因此无法使用提供的解决方案。 在使用 sonar-runner 分析我的项目时,我收到以下警告:
我的脚本有些问题。它应该通过代理打开一个网站,但我总是遇到这个错误,我正在尝试使用几个代理... 它会是什么? Traceback (most recent call last): File "C
我正在使用远程数据库在 PHP 下开发 Web 应用程序,其中我有以下测试脚本: try { $dbh = new PDO('mysql:host=XXX.XXX.XXX.XXX;dbname
我正在尝试使用 php-facebook-sdk 并借助 curl Facebook API 创建广告。 我已经使用 curl 上传了我的视频,它返回了一个 ID。现在,该视频 ID 将用于添加广告,
首先,这是一个编程问题,因为我正在尝试设置与生产服务器一起运行的测试/QA 服务器。 其次,是的,我应该将其发布在 Serverfault 上,但我尝试使用三个不同的 OpenID 提供程序登录,每次
我是一名优秀的程序员,十分优秀!