SwiftUI自定义Font调用weight时报Cannot infer contextual base错误如何解决
报错原因
该报错是不同版本Xcode的Swift类型推断能力差异导致的:你代码中连续使用了两次隐式成员引用(.solDisplay省略了前缀Font.,.heavy省略了前缀Font.Weight.),Xcode 13及更早版本的编译器无法在链式调用场景下完成完整的类型推断,找不到.heavy所属的上下文类型,因此抛出错误。你们团队成员使用的Xcode版本不一致,所以出现部分环境报错、部分环境正常的现象。
解决方案
你可以选择以下任意一种方案解决问题:
- 方案1:显式声明字重参数的类型
把.heavy补全为Font.Weight.heavy,编译器可以直接识别类型,无需修改其他逻辑:("Display - Heavy", .solDisplay.weight(Font.Weight.heavy)), ("Headline - Heavy", .solHeadline.weight(Font.Weight.heavy)), - 方案2:显式声明自定义字体的所属类型
把.solDisplay/.solHeadline补全为Font.solDisplay/Font.solHeadline,给编译器提供明确的类型推断起点:("Display - Heavy", Font.solDisplay.weight(.heavy)), ("Headline - Heavy", Font.solHeadline.weight(.heavy)), - 方案3:在Font扩展内提前定义对应字重的属性
避免在业务代码中链式调用修改字重,同时保留调用的简洁性:extension Font { static let solDisplay: Font = .custom("Gilroy", size: 36) static let solDisplayHeavy: Font = solDisplay.weight(.heavy) static let solHeadline: Font = .custom("Gilroy", size: 24) static let solHeadlineHeavy: Font = solHeadline.weight(.heavy) } // 业务代码调用示例 ("Display - Heavy", .solDisplayHeavy), ("Headline - Heavy", .solHeadlineHeavy), - 方案4:全团队统一升级到Xcode 14及以上版本
新版本的Swift编译器优化了链式调用场景的类型推断逻辑,原写法可以直接正常编译。
内容的提问来源于stack exchange,提问作者JaWeilBaum
相关产品推荐
相关产品推荐

