Swift 中单例类的委托

2024-01-05

如何使用单例/共享类的委托方法? 有一个单例类定义了一些协议,但我不知道如何访问其他类中的委托函数。

供参考的代码片段(swift):

protocol AClassDelegate
{
  func method1()
}

class A
{
   static let shared = A()

   override init() {
     //initialisation of member variables
   }

   var delegate: AClassDelegate
   func foo() {

   }
}


class B: AClassDelegate
{
   func bar() {
      // Note: not getting call to 'foo' method of class 'A'
      A.shared.delegate = self
      A.shared.foo()
   }
}

这个实现正确吗?


首先,我想指出:

1-创建单例类应包含:

private init() {}

这导致强制只能通过使用其共享实例来访问该类。

2-正如中提到的麦克斯的回答 https://stackoverflow.com/a/42976838/5501940,委托应该是可选的并且有一个weak参考。

3-该协议应该是一种class, 如下:

protocol AClassDelegate: class

有关更多信息,您可能需要检查此.


现在,为了测试目的,我们假设method1() from AClassDelegate打电话时应该被叫到foo() from A class:

protocol AClassDelegate: class {
    func method1()
}

class A {
    private init() {}
    static let shared = A()

    weak var delegate: AClassDelegate?

    func foo() {
        print(#function)

        delegate?.method1()
    }
}

让我们实现符合以下条件的类AClassDelegate:

class B: AClassDelegate {
    func bar() {
        A.shared.delegate = self
        A.shared.foo()
    }

    func method1() {
        print("calling the delegate method B Class")
    }
}

class C: AClassDelegate {
    func bar() {
        A.shared.delegate = self
        A.shared.foo()
    }

    func method1() {
        print("calling the delegate method C Class")
    }
}

Output应该:

let b = B()
b.bar()
// this will print:
/*
 foo()
 calling the delegate method B Class
 */

let c = C()
c.bar()
// this will print:
/*
 foo()
 calling the delegate method C Class
 */
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift 中单例类的委托 的相关文章

  • 将数据从子模态 VC 传递到父视图控制器的最佳方法?

    将数据从子模式视图传递到父视图控制器的最佳方法是什么 我的 iPad 应用程序上有一个子模式登录屏幕 我想将用户信息传回父级分割视图控制器 我正在考虑使用 NSNotification 但我不确定这是否是将数据传递回父级的最简单 最有效的方
  • ios7.1:推送通知徽章更新问题

    我已经设置了Push Notification在我当前的项目之一中 我已遵循推送通知所需的所有说明 在 tag ios7 中工作正常 但在7 1当我的应用程序处于后台模式时 我在徽章更新中遇到问题 我的代码如下 BOOL applicati
  • 尝试使用 Xcode 的新 UI 测试运行多个测试失败

    当我尝试在新的 Xcode beta 中同时运行多个 UI 测试时 它在第一次测试后失败 并在第一次测试后的每个测试中出现错误 UI 测试失败 应用程序状态仍未终止 有人解决这个问题了吗 我也遇到过同样的问题 看来 至少就我而言 应用程序从
  • iOS:GMail API - 通过电子邮件发送附件

    我能够成功发送没有附件的电子邮件 但是 当我尝试使用 GTLUploadParamaters 上传附件时 出现 501 错误 我尝试添加照片库中附件的 NSData 以及仅发送图像的 URL 在这两种情况下我都得到了同样的错误 Create
  • 领域列表未存储在 Swift 4.2 的发布配置中

    我刚刚构建了我的应用程序的最新版本 并且遇到了一个问题List我的所有领域对象上的 s 都没有被存储 这是一些示例代码 Object public class ReportItem Object objc dynamic var id St
  • Alamofire 仅在 GET 请求上出现请求错误

    我正在努力将我的项目从 AFNetworking 转移到 Alamofire 真的很喜欢这个项目 POST 请求工作得很好 但是 我在尝试发出 GET 请求时收到此错误 这是一些示例代码 class func listCloudCrednt
  • 了解 malloc_history 转储

    如果您曾经问 过如何调试 Objective C 中的释放 分配问题 您将遇到这些可以帮助跟踪问题的环境设置 NSZombieEnabled 释放后保留对象 以便您可以获得指针等 MallocStackLogging 保留对象历史记录以供以
  • 我可以在滚动时固定表格的 tableHeaderView 位置吗?

    我有一个表视图 并在其 tableHeaderView 上附加了一个 UISegmentedControl 如何使 tableHeaderView 固定 以便即使在滚动表视图时也始终可以在同一位置查看 UISegmentedControl
  • iOS:接收“304 Not Modified”响应时 AVPlayerItem 中的错误

    这是一个非常奇怪的错误 我有一个 tableView 每个单元格都使用AVPlayer从远程服务器流式传输视频 想象一下类似 Vine 的时间线 因此 当我滚动时 重复使用的单元格会使用新视频重新配置播放器 问题是 如果我非常快地来回滚动
  • 核心数据二进制数据允许外部存储崩溃

    我在 iOS 12 0 1 上发生崩溃 日志如下 ImageIO CFDataGetBytes data 0x28539b2f0 size 154262 offset 8 count 8 dst 0x16dbf86f0 External d
  • 如何使用 SwiftUI 拖动工作滑块

    我想拖动一个滑块 当然也让它滑动 我可以做其中之一 但我不能两者都做 如何拖动并拥有可用的滑块 我也尝试找到一种方法来删除手势 但我找不到方法来做到这一点 还尝试了 Apple Composition SwiftUI Gestures 文档
  • 更改 UIAlertController 的标题字体大小

    我正在尝试更改标题fontSize in an UIAlertController 但我无法管理如何设置我的NSMutableAttributedString to the title 财产 所以我一直在创造NSMutableAttribu
  • Xcode - 免费清除设备文件夹?

    我正在删除一些文件夹和文件 以便在驱动器上腾出更多空间 我知道在路径中 Library Developer CoreSimulator Devices 每个模拟器和每个版本都有文件夹 这个文件夹对我来说大约有 11GB 大小 我知道我可以删
  • iOS 9.3 出现新的 UIPDFPageRenderOperation 错误?

    我正在向 UIWebView 添加一些 PDF 链接 每次加载并做出滚动手势时 都会收到此错误 objc 910 UIPDFPageRenderOperation 对象 0x14acaca10 过度释放 当已经解除分配时 打断 objc o
  • 如何为 App Store 添加关联域? - App Store Connect 的 app-ads.txt 文件

    如您所知 Admob 向发布商发送了有关 app ads txt 文件的电子邮件 Admob 在电子邮件中表示 因此 我们邀请您仔细检查您的 app ads txt 文件 如果 您已经在发布日期之前发布了一份 文件 应发布在列出的网站的根目
  • 快速从 appDelegate 中 popToRootViewController

    我试图从应用程序委托弹出到导航堆栈的根视图控制器 并且在将 obj c 中的内容转换为 swift 时遇到一些问题 obj c 中的工作原理 UINavigationController navigationController UINav
  • geocoder.geocodeAddressString 今天不再适用于快速更新

    https developer apple com library prerelease mac releasenotes General APIDiffsMacOSX10 11 Swift CoreLocation html https
  • 启动时运行后台任务

    我正在编写一个 iOS 应用程序 它使用 Dropbox Datastore API 在多个设备之间同步数据 在 Android 上 我可以告诉服务在启动时启动 这使其能够同步 设备关闭时可能发生的任何更改 我无法找到让我的应用程序在 iO
  • 无法在 Swift 中获取 plist URL

    我对这个真的很困惑 网络上有很多问题询问 如何从 Swift 中的 plist 文件获取信息 并且到处都发布了相同的答案 let path NSBundle mainBundle pathForResource Config ofType
  • Eddystone 信标检测问题

    以下是我使用 iPhone iOS 9 检测 Eddystone 的代码 void viewDidLoad super viewDidLoad if CLLocationManager locationServicesEnabled loc

随机推荐

  • 简单的子域重定向 PHP

    我的移动应用程序有一个子域 就像http m traffic domain com http m traffic domain com现在我希望我的用户可以通过访问访问他们的页面http m traffic domain com 用户名 h
  • 当我用 menhir 生成解析器时,有没有办法导出更多东西?

    我正在使用 menhir 生成解析器 现在 它从我的 parser mly 文件生成的 parser mli 文件如下所示 The type of tokens type token huge ADT definition goes her
  • 使用 TypeScript 在 Angular 管道中使用 MapToIterable

    尝试在 Angular 中实现管道 在意识到 ngFor 不适用于地图之后 一些研究让我相信未来的功能将会解决这个问题 但与此同时 mapToIterable 管道就是答案 我有以下代码 import Pipe PipeTransform
  • 如何在Android手机中查找应用程序崩溃日志?

    如果任何 Android 应用程序崩溃 则会代表该应用程序生成一些崩溃日志 如何找到此类崩溃日志的位置 我想要 Android 设备内部的崩溃日志 而不是真正使用 Logcat 来查看崩溃日志 在 logcat 堆栈跟踪中 您可以找到异常
  • 我可以使用什么 CSS 来缩放画布以填充其容器而不改变其纵横比?

    我有一个特定尺寸的画布 比如说 300x150 我可以使用什么 CSS 来缩放画布以填充其容器 而不改变其纵横比 并将其水平和垂直居中 以获得缩放后剩余的任何额外空间 我试过这个 box sizing border box moz box
  • Android 4.4.2 中 Google API(x86 系统映像)和 Google API(ARM 系统映像)之间的差异

    我正在关注这个 http developer android com google play services setup html Install http developer android com google play servic
  • 只读内存和堆内存

    AFAIK 在 C 语言中 字符串文字存储在只读存储器中 它实际上存在于硬件上的什么位置 根据我的知识堆在 RAM 上 如果我错了 请纠正我 堆和只读内存有什么不同 它依赖于操作系统吗 这通常是在硬件辅助下完成的 可以告诉硬件的虚拟内存子系
  • 如何防止对我的用node.js编写的http服务器进行DOS攻击?

    使用node js 用于构建可以处理http请求的tcp服务器的net模块 我想防止 ddos 攻击 所以我所做的是这样的 if status numOfCurrentRequests 1 gt MAX NUM OF CONNECTIONS
  • 如何在CSS中创建双底边框

    我想在标题底部创建一个双边框 其中有两条不同粗细的线 其间有 1px 的空间 具体来说 顶线的厚度为 2px 底线的厚度为 1px 这是我想要达到的美学目标的图像示例 其他使用此设计方面的网站 http www rollingstone c
  • MSBuild 使用凭据调用 Powershell

    我正在尝试使用运行 Powershell 命令的 MSBuild 脚本来部署 Windows 服务 MSBuild 脚本部署我需要的文件 PowerShell 脚本将使用以下命令卸载并重新安装 Windows 服务 Invoke Comma
  • 使用参数循环进行量角器测试

    我有一组几乎完全相同的烟幕测试 我想将它们放入循环中并在参数数组中循环 但是 测试是异步运行的 因此循环在测试运行之前完成 这导致测试对第 8 个参数运行 8 次 而不是每个参数运行一次 describe Admin Console Cam
  • AngularJS 中的简单 dom 操作 - 单击按钮,然后将焦点设置到输入元素

    我有这个角度代码 div class element wrapper div class first wrapper div class button element name div div div class second wrappe
  • Android - 尝试添加图像时会创建空白图像

    我使用的是Android Studio 1 5 我正在尝试做一些非常简单的事情 向我的项目添加一个大图像 我将使用它作为我的 MainActivity 的背景 当我右键单击 res gt Add gt Image Asset 并选择 操作栏
  • Google Admin SDK Push API 发送“同步”网络钩子,但仅此而已

    我的应用程序使用推送通知 API 在文档中也称为频道订阅或 Webhooks 和报告 API 来获取有关身份验证令牌的实时更新 每 6 小时 我们的应用程序就会发出一个请求https www googleapis com admin rep
  • 为什么子进程忽略 PATH,我该如何更改它?

    我需要更改 Python 应用程序调用的程序 很遗憾我无法更改 Python 代码 我只能改变调用环境 特别是 PATH 但不幸的是Python的子进程模块似乎忽略了PATH 至少在某些情况下 我怎样才能强迫Python尊重PATH当搜索要
  • 分布式MAKE

    我之前有一个 MAKE 编译过程 大约需要 1 小时才能完成 我使用 j 命令并能够将其减少到 40 分钟 我观察到 CPU 利用率很高 我的导师建议我将作业分配到我们组织可用的不同服务器或机器上 我读过有关 distcc 的内容 但它只能
  • Ruby 数组 - 求对角线之和

    以前没见过这个 但我想知道如何在 Ruby 中找到 2D 数组的两个对角线之和 假设您有一个简单的数组 包含 3 行和 3 列 array 1 2 3 4 5 6 7 8 9 我可以使用以下方法将其分成三组 array each slice
  • Android - 如何知道mapView是否正确加载?

    我在检测我的 Android 地图应用程序中是否加载了 MapView 时遇到了麻烦 在OnCreate方法中 当我分配地图URL时 我想知道是否发生了任何问题 由于我的互联网连接或任何其他问题 例如从 REST 服务加载地图 可能会出现问
  • 如何从服务器下载XML文件并将其保存到SD卡中?

    在我的应用程序中 我尝试从服务器下载 XML 文件并将其存储在 SD 卡中 为此 我使用以下代码 try File root android os Environment getExternalStorageDirectory File d
  • Swift 中单例类的委托

    如何使用单例 共享类的委托方法 有一个单例类定义了一些协议 但我不知道如何访问其他类中的委托函数 供参考的代码片段 swift protocol AClassDelegate func method1 class A static let