import SwiftUI
struct ContentView: View {
@State private var fiveNumbers: Set<Int> = []
@State private var twoNumbers: Set<Int> = []
// there has to be a better way to copy a Set instead of making it a string like this. it includes brackets too....
// options: remove all [] from string OR find another way to get the numbers into the boxes without being a string
@State private var fiveSentence = ""
@State private var twoSentence = ""
var body: some View {
NavigationStack {
Form {
Button("Faz o meu Euromilhões") {
fiveNumbers.removeAll()
twoNumbers.removeAll()
while fiveNumbers.count < 5 {
let newRandomNumber = Int.random(in: 1...50)
fiveNumbers.insert(newRandomNumber)
}
let sortedNumbers = fiveNumbers.sorted()
fiveSentence = "\(sortedNumbers)"
while twoNumbers.count < 2 {
let newRandomNumber = Int.random(in: 1...12)
twoNumbers.insert(newRandomNumber)
}
let sortedTwoNumbers = twoNumbers.sorted()
twoSentence = "\(sortedTwoNumbers)"
}
Section("Números") {
Text(fiveSentence)
}
Section("Estrelas") {
Text(twoSentence)
}
}
.navigationTitle("Euromilhões")
.toolbar {
if !fiveNumbers.isEmpty {
Button("Limpar") {
fiveSentence.removeAll()
twoSentence.removeAll()
fiveNumbers.removeAll()
twoNumbers.removeAll()
}
}
}
}
}
}
首先我要说的是,我没有编码经验,而且我是一个绝对的初学者。这是我在使用 100 天 Swift 一周后正在修改的一个一次性项目。
- Q1:这样可以吗,或者我应该在按钮主体之外计算(不确定这是否是正确的术语?):
Button("Faz o meu Euromilhões")
Q2:我尝试变得“聪明”并使用
@State private var fiveNumbers: Set<Int> = []
而不是
@State private var fiveNumbers: [Int] = []
避免编写更多代码来避免重复的数字。
if !fiveNumbers.contain(newRandomNumber) { fiveNumbers.append(newRandomNumber) }
但是如何将数组放入不带括号的
Text
中?
非常感谢您的时间和耐心!
Q1:您的做法在形式上是“可以”的。它并不违反 SwiftUI 的工作方式。你并没有真正在
body
的 ContentView
内进行计算。相反,您将“闭包”(函数)传递给 Button
。 Button
保存闭包并在稍后点击它(Button
)时运行它。这就是计算发生的时候。
您这样做的方式对于玩具项目来说也是“可以的”,您不打算长期保留代码,也不打算编写测试用例。
如果这是一个严肃的项目,您可能希望将该代码分解为一个独立的函数,以便您可以为其编写测试。
Q2:这是将
Set<Int>
变成 Text
的一种方法:
Text(
fiveNumbers
.sorted()
.formatted(ListFormatStyle(memberStyle: .number))
)