SwiftUI:如何避免在GeometryReader中使用大量的 self.

思路就是把 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))
}
	
原文地址:https://www.cnblogs.com/ZJT7098/p/13986852.html