gpt4 book ai didi

具有关联值和函数比较的 Swift 3 枚举

转载 作者:搜寻专家 更新时间:2023-11-01 06:32:40 25 4
gpt4 key购买 nike

我有一个具有枚举属性和函数的结构:

struct UserInput {
enum State {
case unrestricted
case restricted(because: WarningType)

enum WarningType {
case offline
case forbidden
}
}

var config: UserInputConfig?
var state: State = .unrestricted

func isConfigured() -> Bool {
// Arbitrary checks about the config...
}
}

有没有办法重写以下条件,以便在同一语句中检查 isConfigured()state

if case .restricted = userInput.state {
return 1
} else if userInput.isConfigured() {
return 1
} else {
return 0
}

似乎是因为 State 枚举使用关联值,您不能简单地编写 if userInput.state == .restricted || userInput.isConfigured(),需要使用if case语法。一定有办法解决这个问题吗?

最佳答案

你想这样做:

if case .restricted = userInput.state || userInput.isConfigured() {
return 1
} else {
return 0
}

但是目前还没有办法用模式匹配做一个OR。有几种方法可以执行AND

通过使用 DeMorgan's Laws , 你可以转 if a || bif !(!a && !b) 并通过反转 thenelse 子句 if 语句,你可以只检查 if !a && !b

不幸的是,你不能说 if !(case .restricted = userInput.state),但由于你的枚举只有 2 个 case,你可以用 if case .unrestricted 替换它= userInput.state.

现在,您如何将它与另一个语句一起使用?您不能使用 && 的原因与您不能使用 || 的原因相同。

您可以使用匹配两个失败条件(使用 AND)的模式来检查失败情况,然后如果两个失败条件都不匹配则返回 1遇见:

if case (.unrestricted, false) = (userInput.state, userInput.isConfigured()) {
return 0
} else {
return 1
}

等效地,您可以使用多子句条件:

if case .unrestricted = userInput.state, !userInput.isConfigured() {
return 0
} else {
return 1
}

除了更短和 IMO 更易于阅读之外,第二种方法可以短路并在 case .unrestricted 的情况下跳过调用 userInput.isConfigured = userInput.state 失败。

关于具有关联值和函数比较的 Swift 3 枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45099190/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com