【问题标题】:I'm trying to make basic random numbers..swift我正在尝试制作基本的随机数..swift
【发布时间】:2021-02-03 14:12:51
【问题描述】:

感谢您的关注。 我是编码方面的超级新人.. 我认为这是一个非常基本的但我无法弄清楚,

我正在尝试制作 6 个随机数!像“强力球”、“乐透”或任何类型的随机唯一数字所需的游戏! 我正在尝试使用 swiftUI

我可以做一个随机数.. 像这样

struct ContentView: View {

@State private var showDetails = false


var body: some View {
    VStack {
        Spacer()
        if showDetails {
            
            Text("\(Int.random(in: 1...45))")
                .font(.largeTitle)
                
        }
        Button(action: {
            self.showDetails.toggle()
        }) {
            Text("BUTT")
                .padding(.bottom, 30)
        }
    }
    
    
}

我可以做 6 次 (前锋) 但是有重叠数字!

这就是我所做的......

import SwiftUI


struct ContentView: View {

@State private var showDetails = false

var randomArray: [Int] = []
var randomNumbers = Int.random(in: 1...45)


var body: some View {
    VStack {
        Spacer()
        if showDetails {
            
            randomArray.append(randomNumbers)
            
            Text("\(randomArray)")
                .font(.largeTitle)
            
        }
        Button(action: {
            self.showDetails.toggle()
            
        }) {
            Text("BUTT")
                .padding(.bottom, 30)
        }
    }
    
    
}
}


struct ContentView_Previews: PreviewProvider {
static var previews: some View {
    ContentView()
}

}

它告诉我

'类型'()'不能符合'视图';只有结构/枚举/类类型可以符合协议' '不能对不可变值使用变异成员:'self' 是不可变的'

我认为“randomArray”或“randomNumers”是正确的 但 'randomArry.append(randomNumbers)' 或 Text("(randomArray)")' 可能是错的..

我尝试了 2 天,我发现了很多东西,但我仍然无法做到.. 所以..你能给我一点帮助吗?谢谢!

【问题讨论】:

    标签: swift random swiftui


    【解决方案1】:

    获取包含 6 个唯一随机数的数组的简单方法是

    let randomNumbers = Array(1...45).shuffled().prefix(6)
    

    我不完全确定您想在 UI 中做什么,但这是一种解决方案

    struct ContentView: View {
        @State private var showDetails = false
        let randomNumbers = (1...45).shuffled().prefix(6)
    
        var body: some View {
            VStack {
                Spacer()
                if showDetails {
                    ForEach(randomNumbers, id: \.self) { number in
                        Text(String(number))
                    }
                }
                Button(action: {
                    self.showDetails.toggle()
                }) {
                    Text("BUTT")
                        .padding(.bottom, 30)
                }
            }
        }
    }
    

    如果您想为每次按下按钮生成一组新数字,那么您可以创建一个生成数字的函数

    func generateRandomNumbers() -> [Int] {
        Array((1...45).shuffled().prefix(6))
    }
    

    并在 ForEach 中调用它

    ForEach(generateRandomNumbers(), id: \.self) { number in
    

    【讨论】:

    • 哇.. 这就是我想要的一切 Joakim Danielson 非常感谢!很难理解所有这些,但该代码正是我想要的!我会努力学习的~谢谢!!
    【解决方案2】:

    代码似乎试图将随机数添加到数组中,这是按下按钮以显示随机数数组内容时的副作用。

    错误消息不清楚,但发生的情况是编译器在布局 UI 时发现了代码中的状态突变,这可能导致竞争条件。

    为了使事情正常进行,代码需要将 UI 布局与状态更新分开,以便它们在不同的周期中发生。

    下面是一个例子:

    import SwiftUI
    
    struct ContentView: View {
        @State var randomArray: [Int] = []
        var arrayString: String {
            if randomArray.count == 0 {
                    return  "No numbers"
            } else {
                return randomArray.map { "\($0)" }.reduce("") { $0 + " " + $1 }
            }
        }
    
        var body: some View {
            VStack {
                Text("My random numbers = \(arrayString)")
                Button("New random number") {
                    randomArray.append(Int.random(in: 1 ... 45))
                }
            }
        }
    }
    
    struct ContentView_Previews: PreviewProvider {
        static var previews: some View {
            ContentView()
        }
    }
    

    祝你好运,玩得开心。

    PS:如果学习 Swift,Hacking With Swift 网站是一个很好的资源

    【讨论】:

    • 哇,我试试这个!非常感谢!现在我知道我可以走这么多路!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多