gpt4 book ai didi

swift - 如何为不同类型定义通用“无效”值

转载 作者:可可西里 更新时间:2023-11-01 01:56:50 26 4
gpt4 key购买 nike

在我的应用程序中,我使用整数、 double 、 float 和 CGFloats 来表示许多不同的值。根据我的应用程序的语义,这些值可能会变成“无效”,我使用保留值 i 来表示这种状态。 e. -1。使它在代码中可用的最简单方法是:

anIntVariable = -1
aFloatVariable = -1
aDoubleVariable = -1.0
...

为了摆脱这种约定俗成的方法并提高可读性和适应性,我定义了一些扩展:

extension Int {
static var invalid = -1
}
extension Float {
static var invalid = -1.0
}
extension Double {
static var invalid = -1.0
}
...

所以上面的代码现在应该是:

anIntVariable = .invalid
aFloatVariable = .invalid
aDoubleVariable = .invalid
...

它确实有效。但是,我对这种方法并不满意。你们中有人有更好的表达方式吗?

为了增加一些复杂性,除了像 IntFloatDouble 这样的简单类型之外,我还使用了 Measurement 基于这样的类型:

let length = Measurement(value: .invalid, unit: UnitLength.baseUnit())

如果您找到一种方法在您的解决方案中也包含“无效”测量,则会获得额外的奖励积分......

感谢您的帮助!


一些额外的想法

我知道我可以使用带有 nil 的可选值,意思是“无效”。然而,在这种情况下,您将有条件解包的额外开销......此外,使用 nil 作为“无效”是另一个约定。

没有好坏之分,只是不同而已。 Apple 在其自己的 API 中使用“无效”值,即。 e.如果 View 不在 TableView 中,NSTableView方法row(for:) 将返回-1。然而,我同意这个方法完美地说明了返回一个可选值很有意义......

最佳答案

我会为此使用可选值。

如果您希望缺少值和无效值在您的应用中处于不同状态,我建议为您的值创建一个包装器:

enum Validatable<T> {
case valid(T)
case invalid
}

然后像那样使用它:

let validValue : Validatable<Int> = .valid(5)
let invalidValue : Validatable<Int> = .invalid

var validOptionalDouble : Validatable<Double?> = .valid(nil)
validOptionalDouble = .valid(5.0)

let measurement : Validatable<Measurement> = .invalid

等等

然后您可以通过打开该枚举来检查值以访问关联值,如下所示:

switch validatableValue {
case .valid(let value):
//do something with value
case .invalid:
//handle invalid state
}

if case .valid(let value) = validatableValue {
//handle valid state
}

等等

关于swift - 如何为不同类型定义通用“无效”值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52273028/

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