# 老司机 iOS 周报 #292 | 2024-06-10

![ios-weekly](https://github.com/SwiftOldDriver/iOS-Weekly/blob/master/assets/weekly-header/292.jpg?raw=true)
老司机 iOS 周报，只为你呈现有价值的信息。

你也可以为这个项目出一份力，如果发现有价值的信息、文章、工具等可以到 [Issues](https://github.com/SwiftOldDriver/iOS-Weekly/issues) 里提给我们，我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 [Issues](https://github.com/SwiftOldDriver/iOS-Weekly/issues) 提出。

## 新闻

### 🌟  [【老司机技术出品】 WWDC24 内参目录（更新中）](https://wwdc-reference.feishu.cn/wiki/QsFQwuOgcirBZck2xorcGtwUnKb?table=tblETPZEPEmxZ8gy&view=vewysxfUqf)

今年我们如期带来 Session 的汇总，并会在每天推送当天新放出的 Session ，欢迎大家关注更新。

## 文章

### 🌟 🐕 [What Does spacing = nil Mean in SwiftUI? ](https://fatbobman.com/en/posts/spacing-of-swiftui/)

[@zoeGuo](https://github.com/zoeGuo)：作者通过探讨子视图间不一致的间距问题，深入分析了 spacing 参数的默认值 nil 所代表的含义。作者从“是什么”、“为什么”、“怎么用”的角度，分析了 SwiftUI 中 spacing 的构成和原理。对开发者在处理复杂布局、追求 UI 细节时有很大帮助，掌握一些 spacing 技巧也能帮助实现一些用传统方法难以达到的布局效果。

### 🐎 [How Do You Know Whether or Not SwiftUI Previews and Preview Content Are Excluded From App Store Builds?](https://jaredsinclair.com/2024/05/20/preview-content.html)

[@Kyle-Ye](https://github.com/Kyle-Ye): 部分同学写 Preview 代码可能没有加 `#if DEBUG` 的习惯，理想情况下也确实不用加。Preview 代码不会被实际上游代码引用，因此直觉是不用 `#if DEBUG` 也不会出现在最终代码中。本文介绍了目前 SwiftUI Preview + Xcode 的一些 bad case，并建议大家目前对于 Preview 代码还是保持写 `#if DEBUG`。

### 🐎 [Do NOT init State externally in SwiftUI](https://samwize.com/2024/05/08/do-not-init-state-externally-in-swiftui-view/)

[@JonyFang](https://github.com/JonyFang): 这篇文章详细解析了为何不应在 SwiftUI 中外部初始化 `State`，并提供内联初始化的正确姿势及其他解决方案，避免视图更新问题。

### 🐎 [Swift 集成 KSCrash IOS 崩溃跟踪](https://bin.zmide.com/?p=1220)

[@kemchenj](https://kemchenj.github.io/)：本篇文章讲解了在 Swift 项目中集成 KSCrash 进行 iOS 应用崩溃日志跟踪的方法，并提供了将日志输出到指定文件的解决方案。作者详细介绍了 KSCrash 的配置和自定义输出文件的实现步骤，包含代码示例，帮助开发者更好地管理和分析应用崩溃信息。

> 推荐人：[PBK-B](https://github.com/PBK-B)


### 🐕 [Boost Performance by Over 100x Using the Accelerate Framework](https://getstream.io/blog/accelerate-framework/)

[@BluesJiang](https://github.com/BluesJiang)：这篇文章简单介绍了苹果自带的框架 Accelerate 的应用范围和作用。因为 Accelerate 框架是比较集中在数据特定领域的加速框架，比如视频、图片、音频、科学计算等，所以了解的人不多。本文给出了他们使用 Accelerate 框架的两个应用，并且已经开源，发现这个框架相比于市面上泛用的 C++ 框架有这个更好的计算性能和能效优势，解决了他们在使用常规并行计算时依旧会产生的延迟，并且也显著降低了内存消耗。这个得益于 Accelerate 针对苹果设备的高度优化，并且是苹果自己也在使用的高性能计算框架。
如果你也有类似的实时计算需求，不妨研究一下这个框架，说不定有意外之喜。

### 🐎 [Designing a Declarative API](https://www.mobilesystemdesign.com/blog/declarative-api-design/)

[@DylanYang](https://github.com/Dylan19Yang)：本文作者通过开发一个对用户输入进行验证的 Validator 的例子，一步步为大家揭示了如何去设计一个声明式风格的 API。对于不太了解声明式编程的同学来说 SwiftUI 就是一个非常典型的声明式的开发框架。作者对于设计声明式 API 的一个重要思想就是，我们应该优先聚焦在最终的代码应该如何被展现的逻辑和结构上，然后才轮到讨论具体的控制流。同时作者也通过例子证明了声明式编程可以和 UI 无关，也并不一定意味着包含链式调用。

### 🐕 [几个在 SwiftUI 中使用惰性容器的技巧和注意事项](https://fatbobman.com/zh/posts/tips-and-considerations-for-using-lazy-containers-in-swiftui/)

[@AidenRao](https://weibo.com/AidenRao): 这篇文章介绍了在 SwiftUI 中使用惰性容器的几个技巧和注意事项。惰性容器如 List 和 LazyVStack 在展示大型数据集时非常高效，它们只在需要时动态构建和加载视图，从而提升应用性能和内存利用效率。文章提到了自定义遵循 RandomAccessCollection 协议的数据类型，以优化数据源的性能和内存使用。此外，还介绍了实现无限数据加载的方法，以及 id 修饰器对 List 懒加载机制的影响等。这些技巧和注意事项能够使开发者在 SwiftUI 中保持流畅的用户体验和高效的资源使用。

## 代码

### 🌟 🐕 [ZippyFormat](https://github.com/michaeleisel/ZippyFormat)

[@EyreFree](https://github.com/EyreFree): ZippyFormat 是一个更快版本的 NSString stringWithFormat 方法，在 iOS 端可以显著提升字符串格式化的性能。它通过直接将格式化参数追加到 char* 缓冲区，并仅在最后创建 NSString 来优化性能。ZippyFormat 还利用堆栈来避免 NSMutableString 产生的中间堆分配。此外，它在追加格式化参数时无需执行验证，因为已经知道数据是有效的 UTF-8。对于常见的 %@ 参数如 NSNumber、NSDictionary、NSArray 等，ZippyFormat 通过直接复制已知的输出到缓冲区，避免了调用 [object description] 的开销。总的来说 ZippyFormat 通过在较低层次上操作，避免了 Apple 原生实现中不必要的抽象和验证，从而显著提升了字符串格式化的速度。它是一个非常值得尝试的性能优化工具。


## 内推

重新开始更新「iOS 靠谱内推专题」，整理了最近明确在招人的岗位，供大家参考

具体信息请移步：https://www.yuque.com/iosalliance/article/bhutav 进行查看（如有招聘需求请联系 iTDriverr）

## 关注我们

我们是「老司机技术周报」，一个持续追求精品 iOS 内容的技术公众号，欢迎关注。

**关注有礼，关注【老司机技术周报】，回复「2023」，领取 2023 及往年内参**

![](https://github.com/SwiftOldDriver/iOS-Weekly/blob/master/assets/qrcode_for_wechat.jpg?raw=true)

同时也支持了 RSS 订阅：https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom 。

## 说明

🚧 表示需某工具，🌟 表示编辑推荐

预计阅读时间：🐎 很快就能读完（1 - 10 mins）；🐕 中等 （10 - 20 mins）；🐢 慢（20+ mins）
