Как получить доступ к переменной в другой структуре? SWIFTUI - PullRequest
2 голосов
/ 11 марта 2020

Я хотел бы получить доступ к переменным в других структурах, чтобы иметь общее количество.

Пример кода продемонстрировал бы лучше:

struct level1: View {

@State var score1 = 5 

}

struct level2: View {

@State var score2 = 7 

}

В другой структуре я хотел бы иметь возможность использовать переменные Score1 и Score2. Приведенный ниже код не работает, но мне нужно что-то вроде этого.

struct finalScore: View {

@State var totalScore = level1.score1 + level2.score2 

}

Ответы [ 2 ]

2 голосов
/ 11 марта 2020

Переосмыслите это по-другому ... как показано ниже, доверие из одного источника, модель разделена - представление разделено, модель изменена - представление реагирует, вот как работает SwiftUI.

Как

import SwiftUI
import Combine

class ScoreModel: ObservableObject {
    @Published var score1 = 5
    @Published var score2 = 7
}

struct MainView: View {
    @ObservedObject var vm: ScoreModel = ScoreModel()

    var body: some View {
        VStack {
            level1(vm: vm)
            level2(vm: vm)
            Divider()
            finalScore(vm: vm)
        }
    }
}
struct level1: View {
    @ObservedObject var vm: ScoreModel

    var body: some View {
        Text("\(vm.score1)")
    }
}

struct level2: View {
    @ObservedObject var vm: ScoreModel

    var body: some View {
        Text("\(vm.score2)")
    }
}

struct finalScore: View {
    @ObservedObject var vm: ScoreModel

    var body: some View {
        Text("\(vm.score1 + vm.score2)")
    }
}
0 голосов
/ 11 марта 2020

Вам нужно будет использовать @State & @Binding для выполнения sh этого. Вот рабочий код, который делает то, что вы просите.

import SwiftUI

struct ContentView: View {

    @State var score1: Int = 5
    @State var score2: Int = 7

    var body: some View {
        VStack {
            HStack {
                FirstView(score1: $score1)
                SecondView(score2: $score2)
                Spacer()
            }
            Divider()
            Text("The total score is \(score1 + score2)")
            Spacer()
        }
        .padding()
    }
}

struct FirstView: View {
    @Binding var score1: Int

    var body: some View {
        Stepper(value: $score1, in: 0...100) {
            Text("\(score1)")
        }
    }
}

struct SecondView: View {
    @Binding var score2: Int

    var body: some View {
        Stepper(value: $score2, in: 0...100) {
            Text("\(score2)")
        }
    }
}

adds score1 and score2 to display total score

...