如何在macOS Sonoma中禁用iOS Widget?代码类型不匹配报错解决
解决Widget配置类型不匹配问题
问题原因
Swift的some WidgetConfiguration是不透明类型,要求所有分支返回的类型必须完全一致。你的代码大概率是在分支逻辑里,一个返回了原始的supportedFamilies配置,另一个返回了叠加disfavoredLocations后的配置——这两个分支实际返回的是不同的具体类型(比如SupportedFamiliesConfiguration和DisfavoredLocationsConfiguration),所以编译器会抛出类型不匹配的错误。
解决方案
统一配置结构,不管平台都先构建基础的supportedFamilies配置,再针对macOS条件添加disfavoredLocations修饰:
写法1:条件链式修改配置
var baseConfiguration = Self.supportedFamilies([.systemSmall, .systemMedium]) // 替换为你的Widget支持尺寸 #if os(macOS) baseConfiguration = baseConfiguration.disfavoredLocations([.iPhoneWidgetsOnMac]) #endif return baseConfiguration
写法2:用条件编译统一链式调用
return Self.supportedFamilies([.systemSmall, .systemMedium]) .disfavoredLocations( #if os(macOS) [.iPhoneWidgetsOnMac] #else [] #endif )
两种写法都能保证所有代码路径返回的是同类型的配置对象,编译器就不会再报错。
额外提示
disfavoredLocations接受空数组时不会改变原有配置,所以iOS平台传空数组完全不影响功能- 如果是在WidgetBundle中管理多平台Widget,确保每个Widget的配置都遵循这个统一结构
内容的提问来源于stack exchange,提问作者Patrick Koning
相关产品推荐
相关产品推荐

