SwiftUI 随机但独特的元素

SwiftUI Random but unique elements

我有一个包含 3 种字体的简单数组

  var fonts = ["Arial", "System", "Helvetica"]
    
  let randomFont: String

所以用户被要求猜出 3

中的一个
 VStack(spacing: 30) {
                Text("Which font is \(randomFont)?")
            

所以这正确显示了 3 个元素之一。

每个都必须使用字体数组的唯一元素,并且...如果字体与 randomFont 相同,则计数器应增加一个。

这是一个硬编码示例:

        Button(action: { self.score += 1 }) {
            Text("\(randomWord)").font(.custom("Helvetica", size: 40))
        }
        
        Button(action: { self.score += 0 }) {
            Text("\(randomWord)").font(.custom("Arial", size: 40))
        }
        
        Button(action: { self.score += 0 }) {
            Text("\(randomWord)").font(.system(size: 40))
        }
        

我需要帮助来随机化字体,但必须使用所有 3 种字体。此外,我需要将用户选择的随机字体与问题中显示的字体进行比较。如果相同(正确答案)加分。

例如 randomFont 是“宋体” 按钮将以随机字体显示 3 个单词(例如 randomFont2 变量)(Arial、Helvetica 或系统都必须使用并且不能重复)如果用户单击带有 Arial 字体的按钮 +1 点将添加到计数器。

这是一个完整的独立示例。我使用了 3 种截然不同的字体(CourierSystemPapyrus)进行测试。

fonts.shuffle()用于随机化字体。

这三个按钮仅在它们使用和查找的字体索引上有所不同,因此我使用私有函数来构造按钮以避免重复。

随机选择的randomFontIndex使用Int.random(in: 0..<3)选择一个数字即012。要添加更多字体,只需将更多字体名称添加到 fonts 数组即可。不过请确保 select 有效的字体名称!

import SwiftUI

struct ContentView: View {
    let words = ["birds", "meadow", "butterfly", "flowers"]
    @State private var randomFontIndex = 0
    @State private var randomFont = "Courier"
    @State private var fonts = ["Courier", "System", "Papyrus"]
    @State private var score = 0
    @State private var randomWord = ""
    
    var body: some View {
        VStack(spacing: 30) {
            Text("Score: \(score)")
            Text("Which font is \(randomFont)?")
            buttonFromNumber(0)
            buttonFromNumber(1)
            buttonFromNumber(2)
        }.onAppear { self.newGame() }
    }
    
    private func fontFromName(name: String) -> Font {
        switch name {
        case "System":
            return Font.system(size: 40)
        default:
            return Font.custom(name, size: 40)
        }
    }
    
    private func buttonFromNumber(_ number: Int) -> some View {
        Button(action: {
            if number == self.randomFontIndex {
                self.score += 1
            } else {
                self.score -= 1
            }
            self.newGame()
        }) {
            Text("\(randomWord)").font(fontFromName(name: fonts[number]))
        }
    }
    
    private func newGame() {
        fonts.shuffle()
        randomFontIndex = .random(in: 0..<3)
        randomFont = fonts[randomFontIndex]
        randomWord = words.randomElement()!
    }
}