SwiftUI自定义点指示器时遭遇'buildExpression'不可用错误求助
SwiftUI自定义点指示器时遭遇'buildExpression'不可用错误求助
我来帮你搞定这个问题~这个错误的核心原因是SwiftUI的ViewBuilder对视图类型的一致性要求很严格:你把activeImage和inactiveImage定义成了some View类型的存储属性,在ForEach的条件分支里返回这两个属性时,编译器无法确认它们是同一类型的视图,因此触发了buildExpression不可用的错误。
这里有两种简单的修复方案,你可以根据需求选择:
方案一:将存储属性改为计算属性
把activeImage和inactiveImage改成计算属性后,每次访问都会返回明确的视图类型,编译器能识别它们的类型一致:
private var activeImage: some View { Image("dotindicator-active") .renderingMode(.original) .colorMultiply(.green) } private var inactiveImage: some View { Image("dotindicator-inactive") }
方案二:用AnyView做类型擦除
如果一定要保留存储属性,可以用AnyView将两个视图统一类型,让编译器认为它们是同一类型:
private let activeImage: AnyView = AnyView(Image("dotindicator-active") .renderingMode(.original) .colorMultiply(.green)) private let inactiveImage: AnyView = AnyView(Image("dotindicator-inactive"))
完整修正后的代码(方案一版本)
import SwiftUI public struct CustomDotIndicatorView: View { private let indicatorCount: Int private let height: CGFloat private let spacing: CGFloat @State private var _activeIndex: Int = 0 private var activeImage: some View { Image("dotindicator-active") .renderingMode(.original) .colorMultiply(.green) } private var inactiveImage: some View { Image("dotindicator-inactive") } public var activeIndex: Int { get { return self._activeIndex } set { guard newValue >= 0 && newValue < indicatorCount else { return } self._activeIndex = newValue } } init(indicatorCount: Int, default activeIndex: Int = 0, height: CGFloat = 6, spacing: CGFloat = 12) { let actualCount = indicatorCount > 1 ? indicatorCount : 1 self.indicatorCount = actualCount self.height = height self.spacing = spacing if activeIndex < 0 { self.activeIndex = 0 } else if activeIndex >= actualCount { self.activeIndex = actualCount - 1 } else { self.activeIndex = activeIndex } } public var body: some View { HStack(alignment: .center, spacing: spacing) { ForEach(0..<indicatorCount) { index in index == self._activeIndex ? self.activeImage : self.inactiveImage } } } }
这样修改后,ViewBuilder就能正常解析你的条件表达式,错误也就消失啦~
内容来源于stack exchange
相关产品推荐
相关产品推荐

