思路就是把 body 代码封装进一个成员函数。
(斯坦福老头子在swfitui课程中推荐)
当你是把已有的body代码放入 GeometryReader { }
时,就更能体会到这个技巧的好处,它可以帮你避免为已有代码补充大量的 self.
。
代码示例
原代码:
let cornerRadius: CGFloat = 10.0
let edgeLineWidth: CGFloat = 3
let fontScaleFactor: CGFloat = 0.75
var body: some View {
GeometryReader { geometry in
ZStack {
if card.isFaceUp {
RoundRectangle(cornerRadius: self.cornerRadius).fill(Color.white)
RoundRectangle(cornerRadius: self.cornerRadius).stroke(lineWidth: self.edgeLineWidth)
Text(card.content)
} else {
RoundRectangle(cornerRadius: self.cornerRadius).fill()
}
}
.font(Font.system(size: min(size.width, size.height) * self.fontScaleFactor))
}
}
优化后的代码:
let cornerRadius: CGFloat = 10.0
let edgeLineWidth: CGFloat = 3
let fontScaleFactor: CGFloat = 0.75
var body: some View {
GeometryReader { geometry in
self.body(for: geometry.size)
}
}
func body(for size: CGSize) -> some View {
ZStack {
if card.isFaceUp {
RoundRectangle(cornerRadius: cornerRadius).fill(Color.white)
RoundRectangle(cornerRadius: cornerRadius).stroke(lineWidth: edgeLineWidth)
Text(card.content)
} else {
RoundRectangle(cornerRadius: cornerRadius).fill()
}
}
.font(Font.system(size: min(size.width, size.height) * fontScaleFactor))
}