Ошибка предварительного просмотра при инициализации переменной var из переменной среды - PullRequest
1 голос
/ 13 апреля 2020

У меня проблема в режиме предварительного просмотра только из-за способа инициализации одной из моих переменных. Это представление принимает PlayerScore в качестве параметра, потому что мне нужно знать, какой счет редактировать. Он также имеет объект game , в котором хранятся все результаты.

Я просто делаю поиск по индексу PlayersCore в массиве игр PlayerScores для последующего изменения.

Проблема с предварительным просмотром заключается в том, что PlayerScore, который я использую в ScoreEntry_Previews, явно не соответствует UUID playerScore в игровом массиве. Таким образом, он не будет отображать предварительный просмотр, потому что инициализация var завершается неудачей, поскольку он не находит UUID.

Как с этим справиться?

struct ScoreEntry: View {

    @EnvironmentObject var game : Game

    @Binding var isPresented: Bool
    var playerScore: PlayerScore

    var scoreIndex: Int {
        game.playerScores.firstIndex(where: { $0.id == playerScore.id})!
    }

    var body: some View {
        HStack {
            Text("\(self.game.playerScores[self.scoreIndex].totalScore())")
        }
    }
}


struct ScoreEntry_Previews: PreviewProvider {
    static var previews: some View {
        ScoreEntry(
            isPresented: .constant(true)
            ,playerScore: PlayerScore(player: Player(name: "SomePlayer", shortName: "Steph", photoURL:"steph", color: .orange),pointsList: [1,2])
        ).environmentObject(Game())
    }
}
struct PlayerScore: Identifiable, Hashable {

    var id = UUID()
    let player: Player
    var pointsList: [Int]     

    func totalScore() -> Int {
        return pointsList.reduce(0, +)
    }

    mutating func addPoints(scoreValue: Int) {
        pointsList.append(scoreValue)
    }
}
class Game: ObservableObject {

    var players = [Player] ()
    @Published var playerScores = [PlayerScore] ()
}

1 Ответ

1 голос
/ 13 апреля 2020

Не генерируйте автоматически id внутри, вместо этого сделайте его инъекционным, чтобы вы могли создать его в Preview и вводить то же самое в обоих местах

struct PlayerScore: Identifiable, Hashable {
    var id: UUID     // << require external

Обновление: на самом деле вышеупомянутый все еще возможный подход, но ниже альтернативный подход без изменений в UUID.

Протестировано с Xcode 11.4 / iOS 13.4

Полностью протестированный код модуля

struct Player {
    var name: String
    var shortName: String
    var photoURL: String
    var color: Color
}

struct PlayerScore: Identifiable {

    var id = UUID()
    let player: Player
    var pointsList: [Int]

    func totalScore() -> Int {
        return pointsList.reduce(0, +)
    }

    mutating func addPoints(scoreValue: Int) {
        pointsList.append(scoreValue)
    }
}

class Game: ObservableObject {

    var players: [Player]
    @Published var playerScores: [PlayerScore]
    init(players: [Player] = [], scores: [PlayerScore] = []) {
        self.players = players
        self.playerScores = scores
    }
}

struct ScoreEntry: View {

    @EnvironmentObject var game : Game

    @Binding var isPresented: Bool
    var playerScore: PlayerScore

    var scoreIndex: Int {
        game.playerScores.firstIndex(where: { $0.id == playerScore.id})!
    }

    var body: some View {
        HStack {
            Text("\(self.game.playerScores[self.scoreIndex].totalScore())")
        }
    }
}


struct ScoreEntry_Previews: PreviewProvider {
    static var previews: some View {
        let score = PlayerScore(player: Player(name: "SomePlayer", shortName: "Steph", photoURL:"steph", color: .orange), pointsList: [1, 2])
        return ScoreEntry(isPresented: .constant(true), playerScore: score)
            .environmentObject(Game(scores: [score]))
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...