修改Swift枚举关联值

3

我该如何更改枚举类型的特定关联值?

enum Origin {
    case search(searchTerm: String, filtered: Bool)
    case category(categoryName:String, subcategoryName:String)

}

@objc class GameSession: NSObject
{
    var gameOrigin: Origin?

    ...

    @objc func setIsSearchFiltered(filtered:Bool)
    {
        if (<gameOrigin is of type .search?>)
        {
            self.gameOrigin = <change "filtered" associated value to new value>
        }
    }

    ....
}

这个有答案的问题,很不幸,最近并没有帮到我。


@Luda,你能展示一下分配/更新“gameOrigin”的实际代码吗? - Kamran
@Kamran,这就是我要找的。 - Luda
@MartinR,你能否写下你会如何做到这一点?新的枚举值应该具有相同的关联值,除了“filtered”。 - Luda
@MartinR C,有效的方法是使用 case .search(let searchTerm, _):gameOrigin = .search(searchTerm: searchTerm, filtered: filtered)。您可以将其作为答案。顺便问一下,是否有办法使用 if 而不是 case? - Luda
2个回答

5
你只能将新的枚举值分配给变量。 就像在Can I change the Associated values of a enum?中所述, 可以在switch语句中检索当前值的关联值, 使用一个case模式,将关联值绑定到本地变量。
当前关联的filtered值不需要,因此 我们可以在该位置使用通配符模式_
由于var gameOrigin: Origin?是可选的,我们需要一个带有尾随问号的“可选模式”。
switch gameOrigin {
case .search(let searchTerm, _)?:
    gameOrigin = .search(searchTerm: searchTerm, filtered: filtered)
default:
    break
}

同样的功能也可以在if语句中使用case和模式匹配来实现:
if case .search(let searchTerm, _)? = gameOrigin {
    gameOrigin = .search(searchTerm: searchTerm, filtered: filtered)
}

干得好,马丁。非常详细的答案! - Luda

0

Swift更改枚举关联值

[Swift枚举]

使用mutating[关于]函数的另一个示例

enum Section {
    case info(header: String)
    
    mutating func change(newHeader: String) {
        switch self {
        case .info(let header):
            self = .info(header: "\(header) \(newHeader)")
        }
    }
}

//changing
var mySection = Section.info(header: "Hello world")
mySection.change(newHeader: "And Peace")

//printing
switch mySection {
case .info(let header):
    print(header) //"Hello world And Peace"
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接