gpt4 book ai didi

swift - 有没有一种干净的方法来处理 Swift 3 中条件中的赋值表达式?

转载 作者:行者123 更新时间:2023-11-28 15:44:53 24 4
gpt4 key购买 nike

我是 Swift 的新手,正在移植 jay 解析器生成器以输出 Swift 解析器。在解析器框架文件中,我发现了在条件语句中使用赋值表达式结果的结构。例如。 ...

if ((yyN = yySindex[yyStates[yyTop]]) != 0 && 
(yyN += yyErrorCode) >= 0 &&
yyN < yyTable.Length &&
yyCheck[yyN] == yyErrorCode) { ... }

特别注意 (yyN += yyErrorCode) >= 0 表达式

既然 Swift 不允许赋值表达式返回一个值,是否有一种有效的方法来在 Swift 中编写这种类型的结构?

最佳答案

Since Swift doesn't allow assignment expressions to return a value is there an efficient way to code this type of construct in Swift?

是的:将赋值与条件分开,并将其分解成更小的部分(参见例如 @tuple_cat:s answer)。


(不要这样做)

为了它的乐趣,并简要了解一下 Swift 的一些技术可能性; Swift 可以 用于模拟上面那种高度聚集的条件求值。为了快速化您的示例(以一种非常不干净的方式),您可以使用内联 yyN-capturing 和 Bool-returning 闭包来进一步增加不可读性:

if ({_ in yyN = yySindex[yyStates[yyTop]]; return yyN != 0}()) && 
({_ in yyN += yyErrorCode; return yyN != 0}()) &&
yyN < yyTable.Length &&
yyCheck[yyN] == yyErrorCode {
/* ... */
}

Swift 还允许定义自定义运算符,因此我们可以构造赋值运算符,它简单地调用它们的默认版本(副作用),但返回分配的值作为赋值语句的结果。例如。如果 yyNInt 类型:

// some C++ style assignment operators
infix operator ^=: AssignmentPrecedence
infix operator ^+=: AssignmentPrecedence
extension Int {
static func ^= (lhs: inout Int, rhs: Int) -> Int {
lhs = rhs
return rhs
}
static func ^+= (lhs: inout Int, rhs: Int) -> Int {
lhs += rhs
return lhs
}
}

if ((yyN ^= yySindex[yyStates[yyTop]]) != 0 &&
(yyN ^+= yyErrorCode) >= 0 &&
yyN < yyTable.Length &&
yyCheck[yyN] == yyErrorCode) {
/* ... */
}

关于swift - 有没有一种干净的方法来处理 Swift 3 中条件中的赋值表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43261339/

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