Swift学习1周:按钮计算逻辑是否应移出body?Set转无括号文本方法
SwiftUI Euromilhões项目问题解答
问题1:按钮计算逻辑的位置
- 写在body内可行但不推荐。body是视图的渲染核心区域,每次视图状态变化触发刷新时,body内的所有代码都会重新执行。如果计算逻辑复杂,会拖慢渲染速度,还会让视图代码变得臃肿,不利于后续维护和修改。
- 正确的做法是把计算逻辑抽离成独立的私有方法,放在View结构体内部。按钮的action闭包只需要调用这个方法即可,代码结构更清晰,也方便复用和测试。
示例代码:
struct EuromilhoesGeneratorView: View { @State private var fiveNumbers: Set<Int> = [] var body: some View { Button("Faz o meu Euromilhões") { generateMainNumbers() } } private func generateMainNumbers() { fiveNumbers.removeAll() while fiveNumbers.count < 5 { fiveNumbers.insert(Int.random(in: 1...50)) } } }
问题2:Set转无括号的显示字符串
Set本身是无序且默认打印带括号的,要转换成适合Text显示的字符串,步骤如下:
- 用
sorted()把Set转成排序后的数组(默认升序,如需降序用sorted(by: >)) - 把数组里的每个Int转成String
- 用
joined(separator:)方法用指定分隔符拼接成完整字符串
直接在Text里使用的示例:
Text(fiveNumbers.sorted().map { String($0) }.joined(separator: " • "))
或者更简洁的写法:
Text(fiveNumbers.sorted().map(String.init).joined(separator: " - "))
这样就能得到类似3 - 12 - 25 - 37 - 49的无括号字符串,直接用于Text组件显示。
内容的提问来源于stack exchange,提问作者Adjadj
相关产品推荐
相关产品推荐

