SwiftUI - 使用带有提供值的枚举的选择器并返回正确的标签()

标签 swift enums swiftui picker

我有一个问题,不知道如何解决。我有几个返回字符串的枚举,用于项目中的每个位置,在单独的 textPhrases 文件中。

我想用其中的一些来填充一个选择器(分段)。

我想了解应该如何使用和设置标签元素。

我想有一个静态变量,它返回一个带有 [String:Int] [rawCaseValue, index] 的元组,但出现以下错误 - Type '(String, Int)' cannot conform to 'Hashable' ;只有结构/枚举/类类型可以符合协议(protocol)

这是我的代码示例。第二个选择器工作完美,但我想重构它以使用枚举提供的字符串。

//  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)' cannot conform to 'Hashable';只有结构/枚举/类类型可以符合协议(protocol)

我应该如何着手让它工作?

谢谢

最佳答案

下面的代码确实解决了我的问题。

//  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())

如果有人对此有意见,请告诉我。 我总是乐于接受更好的新事物。

关于SwiftUI - 使用带有提供值的枚举的选择器并返回正确的标签(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61485553/

相关文章:

ios - 如何将 ObservableObject 与 UIViewRepresentable 一起使用

swift - 在 XCode 中编写模块化 UI 测试

ios - 如何使用 5 个以上的 ViewController 为 UITabBarController 中的过渡设置动画?

c# - 将枚举集合转换为给定类型的字典

java - 有没有办法强制您切换 Java 中枚举的所有定义值?

ios - 动画文本位置

ios - Firebase 上的好友列表

ios - 在 Swift 中将数组元素加一

java - 什么是表示比枚举更复杂但又不完全是类的字段的良好数据结构?

swift - 菜单标题问题和不透明度降低