当前位置: 首页 > 知识库问答 >
问题:

SwiftUI-使用带有枚举的拾取器和提供的值,并返回正确的tag()

於乐语
2023-03-14

我有个问题,不知道怎么解决。我有几个枚举,它们返回一个字符串,在项目中的每个地方都使用,在一个单独的textPhrases文件上。

我想用它们中的一些来填充一个拾取器(分段的)。

我试图理解如何使用和设置tag元素。

我想让一个静态var返回一个带有[String:Int][rawCaseValue,index]的元组,但是得到以下错误类型'(String,Int)'不符合'hashable';只有结构/枚举/类类型才能符合协议

下面是我的代码示例。第二个拾取器工作得很好,但是我想重构它以使用枚举提供的字符串。

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

错误为-类型“(String,Int)”不能符合“hashable";只有结构/枚举/类类型才能符合协议

我该如何继续让它工作?

谢谢

共有2个答案

赫连越
2023-03-14

你把事情搞得比你需要的复杂多了。看一看Apple's文档,它直接描述了你的用例。

https://developer.apple.com/documentation/swiftui/picker

充运浩
2023-03-14

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

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

如果有人对此有意见,请告诉我。我总是对更好的和新的事物敞开心扉。

 类似资料:
  • 我的模式如下 我正在尝试编写一个方法来检查代码并返回相应的枚举。 event.getStatusCode的有效值是:A,T,U。现在我需要检查这些代码并根据代码返回枚举。我尝试了上面的方法,但它给我代码=["A"]的错误。下面是错误状态。 我该怎么解决这个问题?我是java新手。非常感谢您的帮助,谢谢

  • 我用一些字符串作为属性的常量创建了一个枚举。每个常数中字符串的数量都不一样,所以我使用了varargs(第一次这样做)。这是我的枚举: 现在我想要能够键入类似的内容:

  • 问题内容: def size_of_dir(dirname): print(“Size of directory: “) print(os.path.getsize(dirname)) 是有问题的代码。dirname是一个目录,其中包含 130个 文件,每个文件约 1kb 。当我调用此函数时,它返回 4624 ,这 不是 目录的大小…为什么? 问题答案: 此值(4624B)代表的大小 文件 是 描

  • 本文向大家介绍Java获取枚举的值,包括了Java获取枚举的值的使用技巧和注意事项,需要的朋友参考一下 示例 每个枚举类都包含一个名为的隐式静态方法values()。此方法返回一个包含该枚举的所有值的数组。您可以使用此方法遍历值。重要的是要注意,此方法每次调用时都会返回一个新数组。 如果需要,Set也可以使用EnumSet.allOf(Day.class)。

  • 问题内容: 我想声明一个枚举Direction,它具有一个返回相反方向的方法(以下语法不正确,即,不能实例化枚举,但它说明了我的观点)。这在Java中可行吗? 这是代码: 问题答案: 对于那些按标题吸引的人:是的,您可以在枚举中定义自己的方法。如果您想知道如何调用这种非静态方法,则可以使用与其他任何非静态方法相同的方法- 在定义或继承该方法的类型实例上调用它。如果是枚举,则此类实例仅为s。 因此,

  • 问题内容: 迁移到Hibernate 5.2.7之后,我似乎在id字段中得到了不正确的值。 我的代码: Hibernate触发以下查询: 得出5367。表中id字段的最后一个值为5358。 我明白了 我相信这个问题类似于这和这个,但我不得不问,因为给出的解决方案有没有为我工作: 我加了 到我的persistence.xml,但无济于事。任何帮助将不胜感激。 问题答案: 实际上,当您迁移到新的Hib