首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Swift:为什么在这种情况下CustomStringConvertible描述会运行这么多次?

Swift中的CustomStringConvertible是一个协议,用于自定义类型的描述。当一个类型遵循CustomStringConvertible协议并实现了description属性时,它可以提供一个自定义的描述字符串,以便在打印或调试时使用。

在某些情况下,CustomStringConvertible描述会运行多次的原因可能是由于代码中的多次调用或多次访问了该类型的description属性。这可能是因为:

  1. 打印或调试时多次使用了该类型的实例,每次使用都会调用description属性来获取描述字符串。
  2. 在代码中多次访问了该类型的description属性,每次访问都会调用一次。

为了避免CustomStringConvertible描述运行多次,可以考虑以下几点:

  1. 尽量避免在循环或重复调用的代码块中多次使用该类型的实例进行打印或调试。
  2. 在代码中尽量减少对description属性的多次访问,可以将其结果缓存起来以供多次使用。

总之,CustomStringConvertible描述会运行多次是由于代码中的多次调用或多次访问了该类型的description属性。为了避免多次运行,需要注意代码中对该类型的使用方式。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

理解 Swift Actor 隔离关键字:nonisolated 和 isolated

如果您不熟悉 Swift 中的 Actor,我鼓励您阅读我的文章Swift中的Actors 使用以如何及防止数据竞争,文章内详细描述了它。...本文将解释 Swift 中使用 Actor 时如何控制方法和参数的隔离。...了解Actor的默认行为 默认情况下,actor 的每个方法都是隔离的,这意味着您必须已经 actor 的上下文中,或者使用 await 等待批准访问 actor 包含的数据。...继续您的 Swift 并发之旅 并发更改不仅仅是 async-await,还包括许多您可以代码中受益的新功能。所以当你在做的时候,为什么不深入研究其他并发特性呢?...然而,某些情况下,我们希望控 Actor 隔离,因为我们可能确定只访问不可变状态。通过使用非隔离(nonisolated)和隔离(isolated)关键字,我们可以精确控制Actor的隔离状态。

90730

Swift 中的 Actors 使用以如何及防止数据竞争

当多个线程没有同步的情况下访问同一内存,并且至少有一个访问是写的时候,就会发生数据竞争。数据竞争导致不可预测的行为、内存损坏、不稳定的测试和奇怪的崩溃。...在这种情况下,有两个暂停是有意义的,因为两部分其实没有什么共同点。...nonisolated 是多余的 为什么使用 Actors 时仍会出现数据竞争?...队列二将打印:1 队列二在先,打印出吃食的鸡的数量,该数量仍为:0 这里的不同之处在于我们修改数据时不再访问数据。如果没有同步访问,某些情况下这可能导致无法预料的行为。...继续你的Swift并发之旅 并发更改不仅仅是 async-await,还包括许多您可以代码中受益的新功能。所以当你使用它的时候,为什么不深入研究其他并发特性呢?

2.5K10

Foundation-String

最近写完了Swift 3.0教程 ,接下来这段时间,继续写Foundation 的教程,帮助大家更加深入,系统的学习Foundation 框架,可能持续一段时间,希望有兴趣的朋友加个关注!...很简单,按照下面的步骤做 //1.第一步 让对象遵守协议 CustomStringConvertible class Student:CustomStringConvertible{ var...23 当然我们实现了CustomStringConvertible 协议也可以使用下面的方法查看对象的描述内容 // 映射 let studentReflecting = String(reflecting...江湖求援: 懒加载时,闭包函数执行四次,但在普通加载的时候,只执行两次,具体原因不详,如果您知道为什么这样,烦请留言,感激涕零?!...♡ and ObjectC ♢" print(s) var asciiLogger = ASCIILogger() print(s, to: &asciiLogger) 运行结果: Swift

93610

标准库中的主要关联类型

介绍SE-0358, Swift5.7 已实现。SE-0346 已经引入了主要关联类型特性。本篇提议目的是为了 Swift 标准库中使用此特性,为现有协议支持主要关联类型。...下面列举的这些指南帮助我们标准库采用主要关联类型。由于这个新特性的使用,目前没有大量实际经验来沉淀一套通用的准则,所以这套指南后续逐渐完善。指南包括四个方面: 1....Swift5.7中的新协议Clock只有Instant一个关联类型。实际使用中,开发者更多使用的类型是Instant.Duration而不是Instant类型本身。...时钟往往与一瞬间紧密相连,无法成为有用的约束目标,实际场景中使用瞬间这种场景较少。...把主要关联类型的数量限制为1大多数情况下,最好不要在任何协议上声明多个主要关联类型。保持一个最好。提议方案下面表格列举了标准库中带关联类型的所有公共协议,以及它们提议的关联类型。

47940

Swift 周报 第四十三期

不同隔离域中运行的代码可以并发执行,并且通过 Sendable 检查,防止非 Sendable 值跨越隔离边界传递,从而彻底消除对共享可变状态的并发访问。...一个探索的想法涉及利用 String(describing:) 生成枚举案例的字符串表示形式,但如果客户端为枚举实现 CustomStringConvertible,则这种方法可能失败。...人们有兴趣了解如何调用枚举描述的默认 Swift 标准库实现,以解决 CustomStringConvertible 的客户端实现所产生的问题。...这种方法允许解码不明确的值,但对类型擦除的值(如 AnyEncodable)带来了挑战,使得解码期间难以对类型进行逆向工程。如果解码时不知道类型,则不可能重建原始数据。...如果在不考虑未来解码要求的情况下做出编码决策,则可能会使数据检索变得复杂。

20610

Swift 周报 第四十三期

不同隔离域中运行的代码可以并发执行,并且通过 Sendable 检查,防止非 Sendable 值跨越隔离边界传递,从而彻底消除对共享可变状态的并发访问。...一个探索的想法涉及利用 String(describing:) 生成枚举案例的字符串表示形式,但如果客户端为枚举实现 CustomStringConvertible,则这种方法可能失败。...人们有兴趣了解如何调用枚举描述的默认 Swift 标准库实现,以解决 CustomStringConvertible 的客户端实现所产生的问题。...这种方法允许解码不明确的值,但对类型擦除的值(如 AnyEncodable)带来了挑战,使得解码期间难以对类型进行逆向工程。如果解码时不知道类型,则不可能重建原始数据。...如果在不考虑未来解码要求的情况下做出编码决策,则可能会使数据检索变得复杂。

20210

Swift之 @auto_closure

这种宏实现的方式是没有运行时性能影响的,因为我们知道宏展开基本是直接替换的,没有对表达式求值的过程。...Swift里也实现了这样一个功能的assert()函数,而且没有用到宏(你骗人,明明用到了啊?!, 就是#if !NDEBUG啊。...即便我们非Debug的情况下编译也是一样,那怎么样条件执行呢,像上面的使用宏的方式,当条件满足的时候才对表达式求值?...于是乎Swift引入了一个新的@auto_closure属性,它可以用在函数的里标记一个参数,然后这个参数先被隐式的包装为一个closure,再把closure作为参数给这个函数。...其实predicate还是() -> Bool类型的,只是调用者可以传递一个普通的值为Bool表达式,,然后RunTime自动把这个表达式包装为一个() -> Bool类型的闭包作为参数传给myassert

40420

Swift 发布路线图:更便捷、更高效且更安全

这些新增内容各自分别提案,但在许多情况下它们相互依赖。本文档则会将它们结合起来介绍。...与宣言(可能描述多个可能的方向,某些情况下会是不太可能的方向)不同,本文档描述 Swift 中解决并发需求的一整份计划。...这些特性中有许多都是对本路线图中描述的特性的补充,且随时可能引入。...这些函数可能运行多次或根本不会运行,通常会阻止编译器避开这些副本。 此外,这些问题不可避免地纠缠在了一起。异步回调最终总是只运行一次,这意味着它们无法参与一个永久的引用周期。...但是,即使没有直接涉及 actor 的情况下,当并发状态的系统需要确保正确性时,actor 隔离也限制代码。

77120

从预编译的角度理解Swift与Objective-C及混编机制

这种编译模型下,被引用到的 Module 只会被编译一次,且在运行过程中不会相互影响,这从根本上解决了健壮性和拓展性的问题。...怎么样,是不是很神奇,这个被描述为 "Private" 的头文件怎么就不私有了? 究其原因,还是由于 Clang 的工作机制,那为什么 Clang 要设计出来这种看似很奇怪的工作机制呢?...至于为什么会用这种方式,一方面是这种写法会明确头文件的由来,避免问题,另一方面也是这种方式可以让我们是否开启 Clang Module 中随意切换,当然还有一点就是,Apple WWDC 里曾经不止一次建议开发者使用这种方式来引入头文件...在这种情况下,Clang 是没法按照前面所说的机制去构建 Module 的,因为在这种文件结构中,压根就没有 Modules 和 Headers 目录。...不使用 Framework 的情况下且以 #import 这种标准方式引入头文件时, CocoaPods 上使用 hmap 并不会提升编译速度。

2.1K31

Swift 周报 第九期

该提案是一系列通过分布式 actor的概念扩展 Swift 的 actor 运行时的提案中的第一个,让开发人员不仅可以本地环境中,还可以分布式环境中利用 actor 模型。...作为交换,Swift 自动拒绝可能不安全的存储属性的访问。这是问题描述和建议的解决方案 3。 Actor 的析构器不能再访问实例的不可发送的存储属性。...Swift 并发模型允许任务不同的线程上挂起和恢复。虽然这种行为允许计算资源的更高效用,但有一些令人讨厌的陷阱可能会出现在毫无戒心的程序员身上。...Tom Doron提出了一个想法[19],即默认情况下在支持的平台上静态链接 Swift 运行时库。 Swift 5.3.1 引入了 Linux 上静态链接 Swift 运行时库。...作为交换,Swift 自动拒绝对可能不安全的存储属性的访问。这是问题描述 2和建议的解决方案 1。 Actor 的析构器不能再访问实例的不可发送的存储属性。

85620

Swift5.0的Runtime机制浅析

然而这种开放性也存在着安全的隐患,我们可以借助RuntimeAOP层面上做一些额外的操作,而这些额外的操作因为无法进行管控, 所以有可能输出未知的结果。...在其他语言中一般情况下对象总是作为方法的第一个参数,在编译阶段生成的机器码中,将对象存放在x0这个寄存器中(本文以arm64体系结构为例)。...方法调用和类结构图 Swift类中成员变量的访问 虽然说OC类和Swift类的对象内存布局非常相似,每个对象实例的开始部分都是一个isa数据成员指向类的描述信息,而类中定义的属性或者变量则一般根据定义的顺序依次排列...类的方法以及全局函数 Swift类中定义的类方法和全局函数一样,因为不存在对象作为参数,因此调用此类函数时也不会存在将对象保存到x20寄存器中这么一说。...但是为什么还是要这么做呢?个人觉得还是性能和包大小的问题。

2.2K21

Continuation - 连接异步任务和同步代码

这可能是因为代码本身是引入 async/await 之前编写的,也可能因为它与一些主要由事件驱动组成的系统相关联,在这种情况下,可能需要在内部使用 callback 的同时向程序提供异步接口。...这当然符合 Swift 的常见理念,即首选安全接口,性能是首要考虑因素的情况下,有选择得使用不安全接口。...人们觉得为什么*Continuation类型不公开这些功能。...在这些情况下,如果原始的 API 能够调度队列上(无论生命调度机制,比如线程或者 run loop)直接恢复任务,这是最佳场景,任务的执行器也继续执行该任务。...第二次修改: 描述清楚with*Continuation和*Continuation.resume的执行行为,即在挂起任务之前,with*Continuation立即在当前上下文中执行其操作参数,再取消挂起任务后

2.1K10

Foundation-NSCache

没有数量限制 var countLimit: Int { get set } 提示: 限制不是严格的限制,如果缓存超过限制,缓存中的对象可能会被立刻移除,或者永远不会被移除,取决于缓存的实现机制(我也不太理解为什么这么搞...Optional(swift3_0.Dog) 执行了isContentDiscarded Optional(swift3_0.Dog) 执行了isContentDiscarded Optional...Dog x.isDiscard = true 运行一下: 执行了isContentDiscarded 提示: 当我们调用一次或者多次属性和方法时,isContentDiscarded() 会被执行一次...(swift3_0.Dog) 执行了isContentDiscarded Optional(swift3_0.Dog) 我们发现第一个元素被丢弃了。...cache(_ cache: NSCache, willEvictObject obj: Any) 提示: 设置代理之后,一旦NSCache 缓存的对象被丢弃,触发这个时间

68420

应用程序内购买教程:入门

为显示名称和描述输入“Swift Shopping” 。单击保存。大!您已经创建了第一个IAP产品。 ? 本地化 注意:App Store Connect可能抱怨您缺少IAP的元数据。...您可以采用的一种策略是测试成功案例之前尽可能多次测试失败案例。这样你就需要创建更少的沙盒测试器。一般情况下,请记住,一旦用户(甚至是沙盒)购买了非消耗性IAP,他就不能再次购买,只能恢复它。...在任何一种情况下,当请求完成时,请求和完成处理程序都将被清除clearRequestAndHandler()。 建立并运行。万岁!表格视图中显示了产品列表(目前只有一个)!...最后你会看到这个“Swift Shopping”RazeFace,你一直听到这么多! ?...Apple要求优雅地处理这种情况。不这样做可能导致应用拒绝。 再次打开IAPHelper.swift

5.4K20

从Mach-O角度谈谈Swift和OC的存储差异

导读 本文从二进制的角度初步介绍了Swift与OC的差异性,包括Swift可执行文件中函数表的存储结构、函数的存储结构等(目前只列出基本结构,泛型等结构描述陆续补充)。...Mach-O需要先判断0x1000011820位于哪个segment中,Load Commands里记录每个segment的起始虚拟地址及size。...为什么Swift要采用这种方式来存储数据呢?猜测是为了节省包大小,按照OC的存储习惯存储一个地址需要8字节,而在这里4字节就够了。...从上文中的代码描述来看,某些情况下是不存在VTable的,那么怎么才能知道是否存在VTable呢?如果不存在VTable的情况下,按照存在VTable的结构去解析,造成错乱。...如何实现动态调用 感兴趣的可以下载Demo( https://github.com/pilaf-king/SwiftMachODemo ),在运行时大家可能会有疑问,为什么输出的函数数量与实际写的函数不一致

1.6K50
领券