Apple Permanently Closes Its First Store in China
Apple Permanently Closes Its First Store in China
Apple Permanently Closes Its First Store in China
Last Saturday, Apple officially and permanently closed an Apple Store in Dalian, China, marking the first time the company has closed a directly-operated store in the country. The store opened in 2015, exactly ten years ago. Following the announcement, numerous online reports emerged, with some interpreting this as a signal about Apple's business conditions in China. Since this store happens to be located in my city, I have some firsthand knowledge of the situation and would like to share a different perspective.
When the store opened in 2015, it was situated in Dalian's most prominent commercial district. In its early days, it indeed attracted large numbers of Apple enthusiasts, and given its prime location, many tourists visiting Dalian also made it a must-visit destination, contributing positively to Apple's brand promotion and customer service. However, with urban expansion and the restructuring of functional zones, this once-premier shopping district has been replaced by multiple emerging commercial centers over the past few years. Both foot traffic and the infrastructure of the shopping complex have declined significantly, with current visitor numbers less than one-tenth of peak levels. Within the same district, numerous international brands have also adjusted their presence or withdrawn entirely.
In fact, even when I need to visit an Apple Store now, I choose the second location Apple opened in Dalian in 2016 (situated in a more modern shopping complex). Over the past few years, my family, friends, and I have visited the old shopping district only a handful of times. Therefore, I'm actually surprised Apple waited until now to close this store. The timing coincides with the shopping complex undergoing operational restructuring due to ownership changes, making Apple's decision to close the store a reasonable business move from an operational perspective.
There are rumors that Apple may maintain a two-store presence in Dalian, considering opening a new location in a high-end shopping complex currently under construction at a new landmark site (expected to open in 2028). I genuinely hope this plan materializes, as the new location would be close to where I live—I pass by it almost daily during my walks.
Apple currently operates over 40 official retail stores in China. While online shopping is sufficiently convenient, retail stores remain irreplaceable in terms of brand promotion, cultural dissemination, and after-sales service, particularly in providing unique emotional value for Apple enthusiasts. For a global company like Apple, adjusting store locations based on market changes—opening new stores and closing old ones—is simply routine business practice. While this Dalian closure is indeed a "first in China," it's more coincidence than turning point, a natural outcome of urban evolution and change.
It’s time for my annual summer break ⛱️. Blog posts will be on hiatus for the next 4-5 weeks, while Fatbobman’s Swift Weekly will continue as usual during this period.
Previous Issue|Newsletter Archive
If you appreciate my work and want to promote your product to the Swift and iOS developer community, sponsoring my blog & newsletter could be an excellent opportunity for you.
Original
Swift 6: Sendable, @unchecked Sendable, @Sendable, sending and nonsending
Swift’s concurrency model introduces numerous keywords, some of which are similar in naming and purpose, often causing confusion among developers. This article examines several keywords related to cross-isolation domain passing in Swift concurrency: Sendable
, @unchecked Sendable
, @Sendable
, sending
, and nonsending
, helping you understand their respective roles and use cases.
Recent Recommendations
@isolated(any)
Among the many keywords Swift has introduced for concurrent programming, most are rarely important for API consumers to understand in depth, but can be crucial in specific scenarios. In this article, Matt Massicotte explains one such keyword in detail — @isolated(any)
.
It mainly addresses the type-erasure problem encountered when working with async functions: we can’t statically determine a function’s isolation state. @isolated(any)
adds a special isolation
attribute to indicate whether the function is isolated to an any Actor
instance or is nonisolated. For developers designing APIs that need to accept isolated functions and schedule them intelligently, this offers finer control, particularly in task scheduling and execution ordering.
Swift Observations AsyncSequence for State Changes
The Observation framework brought native, property-level observation to Swift, but from the start it lacked one crucial feature — continuous observation of properties. While this could be partially implemented by recursively calling withObservationTracking
, the shift to strict concurrency in Swift has made writing continuous observation code without concurrency warnings increasingly difficult. In this article, Keith Harrison introduces a new Swift 6.2 feature: using the Observations
function to observe properties of observable objects continuously and safely via an asynchronous sequence. This new API not only solves concurrency-safety issues but also fits neatly into modern Swift async programming patterns.
Unfortunately,
Observations
is strictly limited to iOS 26/macOS 26, which is disappointing for such a practical feature that deserves backward compatibility.
Introducing valkey-swift, the Swift Client for Valkey
Valkey is a high-performance key-value store, forked from Redis 7.2.4 to retain the BSD license and avoid SSPL and commercial license restrictions. Recently, Valkey released its official Swift client, valkey-swift: built with Swift Concurrency, supporting the full Valkey command set, and featuring built-in connection pooling, pipelining, clustering, and Pub/Sub. In this article, Adam Fowler provides complete usage examples and best practices to help Swift developers seamlessly integrate Valkey into their applications.
Build, Run and Debug iOS and Mac Apps in Zed instead of Xcode
With its efficient and collaboration-friendly design, Zed has attracted many developers, but its native Swift support remains limited, making it hard to cover the full development workflow for Apple platforms. In this article, Adrian Ross explains how to combine xcode-build-server and his own tool, xcede, to build, run, and debug iOS and macOS apps in Zed, making it a viable daily alternative to Xcode.
Exploring the Foundation Models Framework
At WWDC 2026, Apple introduced Foundation Models, further strengthening its position in on-device AI. In this article, Luca Palmese details how to obtain the system language model (including specialized adapters), create sessions for complete or streaming responses, use @Generable
and @Guide
for type-safe structured output, and implement the Tool protocol to let models call into app functionality — providing a complete example for building local chat, summarization, and classification experiences.
While Foundation Models showcase the potential of on-device AI, their relatively small parameter sizes leave some developers questioning their capabilities and possible use cases. There’s an ongoing related discussion on Reddit you can join.
Crafting SwiftUI Components for a Scalable Design System
As projects grow in complexity, developers often extend beyond SwiftUI’s native components with custom implementations. However, feature-heavy components can quickly fall into the trap of “overloaded initializers + tightly coupled layouts.” Starting from this pain point, muhammad osama demonstrates, through iterative examples, how to build components that are maintainable, extensible, and accessible — resulting in custom SwiftUI components that retain native usability while evolving gracefully within a design system.
macOS Sequoia End of Cycle Report
With macOS 26 (Tahoe) just a month away, Howard Oakley looks back at macOS Sequoia (15.x)’s year-long lifecycle, summarizing update cadence, security fixes, system size changes, and framework growth trends. In the comments, Howard reveals an intriguing fact: from Sonoma to Sequoia, macOS gained 50 public frameworks but added 708 private frameworks, highlighting Apple’s significant expansion of internal features and apps, with far less growth in third-party developer support.
Tokens are Getting More Expensive
A core assumption behind the massive funding for AI large-model companies is that training and inference costs will drop significantly over time, enabling ideal profit margins. But Ethan Ding points out a harsh reality: users always gravitate toward the highest-performing models (while low-cost older models see minimal adoption), and increases in context capacity have caused per-task token consumption to grow exponentially — making fixed-price “unlimited use” plans economically unsustainable. Using the Claude Code case, the article examines the industry’s “prisoner’s dilemma” and offers three possible escape routes.
苹果首次在中国永久关闭了一家 Apple Store
上周六,苹果正式永久性关闭了位于中国大连的一家 Apple Store 零售店,这是苹果首次在中国关闭直营店。该店于 2015 年开业,距今正好十年。消息传出后,网络上出现了不少相关报道,其中一些将此事解读为苹果在中国经营状况的某种信号。由于该店正好位于我所在的城市,我对这个事件有一些实地了解,想分享一些不同的观察角度。
2015 年该店开业时,其所在位置是大连最核心的商圈。开业初期确实吸引了大量苹果爱好者,加之地理位置的重要性,许多来大连的游客也将其作为打卡地,对苹果的品牌宣传和服务都起到了积极作用。然而,随着城市规模扩大以及功能区域的调整,这个曾经最核心的商圈在过去几年已被多个新兴商圈所取代。无论是人流量还是商业综合体的硬件设施都出现了明显滑坡,目前的人气不及高峰期的十分之一。同一商圈内,不少国际品牌也相继调整或撤出。
事实上,即便我现在需要去 Apple Store,也会选择苹果 2016 年在大连开设的第二家店(位于一个更加现代化的商业综合体)。过去几年间,我和身边的亲友去这个老商圈的次数屈指可数。因此,苹果直到现在才关闭该店反而超出了我的预期。恰逢该店所在商业体因股权变更导致经营业态调整,苹果选择此时关店,从经营角度看是合理的商业决策。
有传闻称,苹果可能仍会在大连保持两店配置,考虑在正在建设的新地标商业综合体(预计 2028 年开业)中开设新店。我倒是真心希望该计划能够实现,因为新址距离我住的地方不远,几乎每天散步都会路过。
苹果目前在中国拥有超过 40 家官方零售店。尽管线上购物已足够便利,但零售店在品牌宣传、文化传播、售后服务等方面的功能仍不可替代,尤其是它能为苹果爱好者提供独特的情感价值。对于苹果这样的全球性企业来说,根据市场变化调整门店布局——开设新店、关闭旧店,本就是常态化的经营行为。这次大连店的关闭虽然是“中国首次”,但更多是巧合而非转折,是城市发展变迁中的一个自然结果。
又到了每年休暑假 ⛱️ 的时候,接下来博客文章将会停更 4-5 周,期间《肘子的 Swift 周报》仍正常更新。
如果您发现这份周报或我的博客对您有所帮助,可以考虑通过 爱发电,Buy Me a Coffee 支持我的创作。
原创
Swift 6: Sendable、@unchecked Sendable、@Sendable、sending and nonsending
Swift 的并发模型引入了众多关键字,其中一些在命名和用途上颇为相似,容易让开发者感到困惑。本文将对 Swift 并发中与跨隔离域传递相关的几个关键字:Sendable
、@unchecked Sendable
、@Sendable
、sending
和 nonsending
进行梳理,帮助大家理解它们各自的作用和使用场景。
近期推荐
@isolated(any)
在 Swift 为并发编程引入的众多关键字中,很多对于 API 使用者来说几乎不需要深入掌握,但在某些特定场景下却至关重要。在本文中,Matt Massicotte 详细介绍了这样一个关键字——@isolated(any)
。
它主要解决了使用 async 函数时面临的类型擦除问题:我们无法静态地获知一个函数的隔离状态信息。@isolated(any)
通过为函数添加一个特殊的 isolation
属性来表示该函数的隔离情况(any Actor
实例或非隔离状态)。对于需要设计能够接受隔离函数并进行智能调度的 API 的开发者来说,这个功能提供了更精细的控制能力,特别是在任务调度和执行顺序保证方面。
使用异步流持续观察属性变化 (Swift Observations AsyncSequence for State Changes)
Observation 框架为 Swift 带来了原生的属性级别观察能力,但从诞生之初就缺少了一个关键功能——对属性的持续观察。虽然可以通过递归调用 withObservationTracking
来部分实现这一需求,但随着 Swift 进入严格并发时代,编写不包含并发警告的持续观察代码变得越来越困难。Keith Harrison 在本文中介绍了 Swift 6.2 新引入的功能:通过 Observations
函数,开发者可以更优雅地使用异步流的方式来对可观察对象的属性进行持续且安全的观察。这个新 API 不仅解决了并发安全问题,还提供了更符合现代 Swift 异步编程范式的解决方案。
Observations
对操作系统版本的严格限制(iOS 26/macOS 26)确实令人遗憾,这样一个实用的功能理应提供向后兼容支持。
Valkey Swift 客户端发布 (Introducing valkey-swift, the Swift Client for Valkey)
Valkey 是一个高性能键值存储系统,源自 Redis 7.2.4 的开源分支,旨在保留 BSD 许可证、规避 SSPL 与商业授权限制。不久前,Valkey 官方发布了 Swift 客户端 valkey-swift:基于 Swift Concurrency 构建,覆盖全部 Valkey 命令集,并内置连接池、管道化、集群与 Pub/Sub 支持。在Adam Fowler 的这篇文章中,你可以看到完整的使用示例与最佳实践,帮助 Swift 开发者在应用中无缝接入 Valkey 的强大能力。
在 Zed 中开发调试 iOS 应用 (Build, Run and Debug iOS and Mac Apps in Zed instead of Xcode)
凭借高效与协作友好的特性,Zed 受到不少开发者青睐,但其对 Swift 的原生支持仍相当有限,难以满足 Apple 平台开发的全流程需求。Adrian Ross 在本文中介绍了如何结合 xcode-build-server 以及自研工具 xcede,在 Zed 中实现 iOS 与 macOS 应用的构建、运行与调试,从而在很大程度上替代 Xcode 作为日常开发环境。
探索苹果端侧 AI 框架 (Exploring the Foundation Models Framework)
在 WWDC 2026 上,苹果推出 Foundation Models,进一步巩固其在端侧 AI 领域的布局。Luca Palmese 在本文中详解了如何获取系统语言模型(含特定用例适配器)、创建会话并进行完整或流式响应、借助 @Generable
与 @Guide
实现类型安全的结构化输出,以及通过 Tool 协议让模型调用应用功能,为在本地构建聊天、摘要、分类等 AI 体验提供了完整示例。
尽管 Foundation Models 展示了端侧 AI 的潜力,但其相对较小的参数规模也让不少开发者对其能力与适用场景存疑。reddit 上正好有一则相关讨论,你也可以参与交流。
构建可扩展的 SwiftUI 组件 (Crafting SwiftUI Components for a Scalable Design System)
随着项目复杂度提升,开发者往往会在 SwiftUI 原生组件之外进行更多自定义。然而,功能堆叠过多的组件很容易陷入“构造器过载 + 紧耦合布局”的困境。muhammad osama 从这一痛点切入,通过逐步迭代示例,演示了如何构建既可维护、可扩展,又兼顾可访问性的组件,让自定义 SwiftUI 组件既具备原生视图的易用性,又能在设计系统中优雅演进。
macOS Sequoia 版本周期总结 (macOS Sequoia End of Cycle Report)
距离 macOS 26(Tahoe)正式发布还有一个月,Howard Oakley 回顾了 macOS Sequoia(15.x)一年的生命周期,总结了版本更新节奏、安全修复数量、系统体积变化以及框架增减趋势。在文章的评论区,Howard 还透露了一组耐人寻味的数据:从 Sonoma 到 Sequoia,新增 50 个公有框架,却增加了 708 个私有框架,显示苹果在不断扩展内部功能和自家应用的同时,对第三方开发者的开放支持增长有限。
大模型成本困境 (Tokens are Getting More Expensive)
AI 大模型公司获得巨额融资的一个核心假设,是随着技术进步,训练与推理成本会显著下降,从而实现理想利润。但 Ethan Ding 指出一个残酷现实:用户始终追求性能最强的模型(而低成本旧模型的使用率极低),同时上下文容量的提升让单次任务的 token 消耗呈指数级增长,使固定价格的“无限使用”模式在经济上不可持续。文章结合 Claude Code 案例,分析了行业面临的“囚徒困境”,并提出三条可能的突围路径。
Have a good rest!