SwiftUI - использование средства выбора с перечислением с предоставленными значениями и возвращением правильного тега () - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть проблема, и я не знаю, как ее решить. У меня есть несколько перечислений, которые возвращают строку, используемую в любом месте проекта, в отдельном файле textPhrases.

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

Я пытаюсь понять, как я должен использовать и настроить элемент тега.

Я думал о наличии stati c var, который возвращает кортеж с [String: Int] [rawCaseValue, index ], но получите следующую ошибку - Тип '(String, Int)' не может соответствовать 'Hashable'; только типы struct / enum / class могут соответствовать протоколам

Вот пример моего кода. Второй инструмент выбора работает отлично, но я хочу изменить рефакторинг, чтобы использовать перечисление Strings.

//  TextPhrases.swift
//  Zinnig

import SwiftUI

enum SalutationClient: String, CaseIterable {
    case noChoice = "…"
    case sir = "Meneer"
    case mrs = "Mevrouw"
    case miss = "Mejuffrouw"

    static let all = SalutationClient.allCases.map { $0.rawValue }

    static var allIndexed : [(String, Int)]{
    var tupleArray: [(String, Int)] = []
    var ind : Int = 0

       for salut in SalutationClient.all //allCases.map({ $0.rawValue })
        {
           tupleArray.append( (salut, ind))
           ind += 1
        }
        return tupleArray
   }
}


//  PersonContentView.swift
//  Zinnig


/// Main Person view
struct PersonContentView: View {

@State private var selectedSalutation = 0

/// next line will be removed and replace by an enum with Strings
@State private var dayPart: [String]  = ["…", "ochtend", "middag", "avond", "nacht"]
@State private var selectedDayPart = 0

...
Form {
        Picker(selection: $selectedSalutation, label: Text("Aanspreken met;")) {
            ForEach ( SalutationClient.allIndexed, id: \.self ) { salutTuple in
                    Text((salutTuple.0)).tag((salutTuple.1))
                }
        }.pickerStyle(SegmentedPickerStyle())

        Picker(selection: $selectedDayPart, label: Text("Selecteer een dagdeel")) {
            ForEach(0 ..< dayPart.count) {
                 Text(self.dayPart[$0]).tag($0)
            }
        }.pickerStyle(SegmentedPickerStyle())
    }

Ошибка: - Type '(String, Int)' не может соответствовать 'Hashable'; только типы struct / enum / class могут соответствовать протоколам

Как мне продолжить работать?

Спасибо

1 Ответ

0 голосов
/ 29 апреля 2020

Следующий код решил мою проблему.

//  TextPhrases.swift
//  Zinnig

enum SalutationClient: String, CaseIterable, Hashable {
    case noChoiceMade = "…"
    case sir = "Meneer"
    case mrs = "Mevrouw"
    case miss = "Mejuffrouw"

    static let all = SalutationClient.allCases.map { $0.rawValue }

    struct TupleStruct: Hashable {
        var salutation: String
        var index: Int
    }

    static var allIndexed : [TupleStruct]{
        var tupleArray : [TupleStruct] = []
        var ind : Int = 0

        for salut in SalutationClient.all       //allCases.map({ $0.rawValue })
        {
            tupleArray = tupleArray + [TupleStruct(salutation: salut, index: ind )]
            ind += 1
        }
        print(tupleArray)
        return tupleArray
    }
}

//  PersonContentView.swift
//  Zinnig

Picker(selection: $selectedSalutation, label: Text("Select een persoon type;")) {
    ForEach(SalutationClient.allIndexed, id: \.self) { salut in
        Text(salut.salutation).tag(salut.index)
    }
}.pickerStyle(SegmentedPickerStyle())

Если у кого-то есть комментарии по этому поводу, пожалуйста, дайте мне знать. Я всегда открыт для лучшего и нового.

...