简体   繁体   中英

how use unique random number

i have MainContentView &

ContentView1 & ContentView2 & ContentView3 & ContentView4 & ContentView5

i use random number between 1 and 5 and its work fine

but same time the random number in all view be same number

https://i.ibb.co/8gWQSFm/Screen-Shot-2019-11-27-at-1-02-24-AM.png

i want unique number in every view

my code

import SwiftUI

struct MainContentView: View {

    var body: some View {
        VStack {
            ContentView1()
            ContentView2()
            ContentView3()
            ContentView4()
            ContentView5()
        }
    }
}

struct ContentView1: View {
    @State var randomNumber: Int = Int.random(in: 1...5)
    var body: some View {
        VStack {
            Text("randomNumber \(randomNumber)")
        }
    }
}
struct ContentView2: View {
    @State var randomNumber: Int = Int.random(in: 1...5)
    var body: some View {
        VStack {
            Text("randomNumber \(randomNumber)")
        }
    }
}
struct ContentView3: View {
    @State var randomNumber: Int = Int.random(in: 1...5)
    var body: some View {
        VStack {
            Text("randomNumber \(randomNumber)")
        }
    }
}
struct ContentView4: View {
    @State var randomNumber: Int = Int.random(in: 1...5)
    var body: some View {
        VStack {
            Text("randomNumber \(randomNumber)")
        }
    }
}
struct ContentView5: View {
    @State var randomNumber: Int = Int.random(in: 1...5)
    var body: some View {
        VStack {
            Text("randomNumber \(randomNumber)")
        }
    }
}

thank you

Add a shuffled array as a property to your main view

struct MainContentView: View {
    let randomNumbers = Array(1...5).shuffled()

Add a property to your sub-views to hold an Int

struct ContentView1: View {
     var randomNumber: Int

Now use values from the shuffled array when construction your views

VStack {
    ContentView1(randomNumber: randomNumbers[0])
    ContentView2(randomNumber: randomNumbers[1])
    ContentView3(randomNumber: randomNumbers[2])
    ContentView4(randomNumber: randomNumbers[3])
    ContentView5(randomNumber: randomNumbers[4])
}

As far as I understood it needs two mutually exclusive values based on one random selection. If so then those one selection must be outside of value consumers.

Taking above into account here is possible demo approach. The idea is to wrap random selector in dedicated value, so whenever it is created the new randomly selected pair is generated. Hope it would be helpful.

struct RandomPair {
    private let value: Int = Int.random(in: 1...2)

    var first: Int { value }
    var second: Int { value == 1 ? 2 : 1 }
}

struct MainContentView: View {

    @State var randomValue = RandomPair()
    var body: some View {
        VStack {
            ContentView1(randomNumber: $randomValue)
            ContentView2(randomNumber: $randomValue)
        }
    }
}

struct ContentView1: View {
    @Binding var randomNumber: RandomPair
    var body: some View {
        VStack {
            Text("randomNumber \(randomNumber.first)")
        }
    }
}


struct ContentView2: View {
    @Binding var randomNumber: RandomPair
    var body: some View {
        VStack {
            Text("randomNumber \(randomNumber.second)")
        }
    }
}

struct DemoRandomPair_Previews: PreviewProvider {
    static var previews: some View {
        VStack {
            ForEach(0..<5, id: \.self) { _ in
                VStack {
                    MainContentView()
                    Divider()
                }
            }
        }
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM