SWIFTUI - Как изменить значение случайной величины в массиве? - PullRequest
0 голосов
/ 27 февраля 2020

Я пытаюсь создать простую игру "бей-моль" с помощью SwiftUI. То, что я хочу сделать в приведенном ниже коде, - это каждый раз, когда отсчитывается второй таймер, один из членов массива resimler, который состоит из изменений resim1..resim9, чтобы иметь значение «mavis», которое является именем изображения в библиотеке.

Когда я печатаю (resimler), из вывода я вижу, что случайный элемент в этом массиве имеет значение "mavis", проблем там нет. Но связанное изображение () в теле не показывает изображение в симуляторе.

Например: ["", "mavis", "", "", "", "", "", "", ""]

Я вижу этот журнал в результат, но Image (resim2) не показывает изображение.

Как мне заставить его показать изображение?

Спасибо!

struct level1: View {

@State var resim1 = ""
@State var resim2 = ""
@State var resim3 = ""
@State var resim4 = ""
@State var resim5 = ""
@State var resim6 = ""
@State var resim7 = ""
@State var resim8 = ""
@State var resim9 = ""

 @State var timecounter = 5
 var timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()

func findMavis() {

    var resimler =  [self.resim1 , self.resim2 , self.resim3 , self.resim4 , self.resim5 , self.resim6 , self.resim7 , self.resim8 , self.resim9 ]

    let randomResim = Int(arc4random_uniform(UInt32(resimler.count - 1)))
    resimler[randomResim] = "mavis"
}
var body: some View {
VStack {

       Text("\(timecounter) seconds remaining").padding(.bottom, 50).onReceive(timer) { input in self.timecounter -= 1

              // the functions in this area will work every second
                     self.findMavis()

          // the functions after this will work after the timer stops
        if self.timecounter == 0 {
            self.timer.upstream.connect().cancel()



            }
        }
  HStack {
    Image(resim1).resizable()
            .frame(width: 100.0, height: 100.0).cornerRadius(50).onTapGesture {

                if self.resim1 == "mavis" {
                    self.scoreUp() }
        }
            Image(resim2).resizable()
            .frame(width: 100.0, height: 100.0).cornerRadius(50).onTapGesture {
            if self.resim2 == "mavis" {
                                   self.scoreUp() }
        }
        Image(resim3).resizable()
        .frame(width: 100.0, height: 100.0).cornerRadius(50).onTapGesture {
             if self.resim3 == "mavis" {
                                   self.scoreUp() }
        }
    }
  HStack {
    Image(resim4).resizable()
        .frame(width: 100.0, height: 100.0).cornerRadius(50).onTapGesture {
             if self.resim4 == "mavis" {
                                   self.scoreUp() }
        }
        Image(resim5).resizable()
        .frame(width: 100.0, height: 100.0).cornerRadius(50).onTapGesture {
             if self.resim5 == "mavis" {
                                   self.scoreUp() }
        }
        Image(resim6).resizable()
        .frame(width: 100.0, height: 100.0).cornerRadius(50).onTapGesture {
             if self.resim6 == "mavis" {
                                   self.scoreUp() }
           }
    }
   HStack {
          Image(resim7).resizable()
        .frame(width: 100.0, height: 100.0).cornerRadius(50).onTapGesture {
             if self.resim7 == "mavis" {
                                   self.scoreUp() }
        }
        Image(resim8).resizable()
        .frame(width: 100.0, height: 100.0).cornerRadius(50).onTapGesture {
             if self.resim8 == "mavis" {
                                   self.scoreUp() }
        }
        Image(resim9).resizable()
        .frame(width: 100.0, height: 100.0).cornerRadius(50).onTapGesture {
             if self.resim9 == "mavis" {
                                   self.scoreUp() }
        }
    }


 }
 }
 }

1 Ответ

1 голос
/ 27 февраля 2020

может быть, вам следует прочитать Swift Tutorial для начинающих, как назначать переменные ...

этим:

var resimler =  [self.resim1 , self.resim2 , self.resim3 , self.resim4 , self.resim5 , self.resim6 , self.resim7 , self.resim8 , self.resim9 ]

    let randomResim = Int(arc4random_uniform(UInt32(resimler.count - 1)))
    resimler[randomResim] = "mavis" // this line is your error

вы не меняете свое self.resim1-9 - Переменные bei в этой строке я указал ошибку.

Вы можете изменить массив на переменную @State, изменить значения непосредственно в массиве и использовать значения тезисов в Image следующим образом: Image (resilmer [0]) и и так далее.

попробуйте это: (хотя я не знаю, что вы хотите сделать .... но код "работает" и нет для спагетти-как

struct ContentView: View {

    @State var timecounter = 5
    @State var score = 0

    var timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()

    func scoreUp() {
        score = score + 1
    }

    @State var resimler : [String] = ["","","","","","","","",""]

    func findMavis() {

        let randomResim = Int(arc4random_uniform(UInt32(resimler.count - 1)))
        self.resimler[randomResim] = "circle.fill"
    }
    var body: some View {
        VStack {
            Text("Score: \(score)")
                .font(Font.largeTitle)
            Text("\(timecounter) seconds remaining").padding(.bottom, 50).onReceive(timer) { input in self.timecounter -= 1

                // the functions in this area will work every second
                self.findMavis()

                // the functions after this will work after the timer stops
                if self.timecounter == 0 {
                    self.timer.upstream.connect().cancel()

                }
            }
            ForEach (0..<9) {index in
                Image(systemName:self.resimler[index]).resizable()
                    .frame(width: 100.0, height: 100.0).cornerRadius(50).onTapGesture {

                        if self.resimler[index] == "circle.fill" {
                            self.scoreUp() }
                }
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...