如何创建一个既可以包含UInt值又可以包含附加值00的类型?

PawełPela

尝试创建将保存一组特定值的类型时遇到问题。这是篮球应用程序。

篮球运动员有球衣号码。在某些欧洲国家(例如该应用程序),数字范围为0到99(含)。但是,还有一个可用的附加值00,它与0不同。

我可以为此使用String,但是String可以存储其他值,并且我必须编写其他验证代码。

现在,我正在使用UInt来存储数字。

有没有更好的方法将这些值存储为Swift类型?

罗布·纳皮尔

这是自定义类型的绝佳用例。绝对不是UInt或任何整数。是#23 +#24 =#47吗?那真是胡言乱语。#99 *#2是什么?再次,胡言乱语。这不是整数。

只是为了更进一步,而“ 00”是合法的球衣号码,而“ 01”则不是。这不仅与“ 1”相同。这不是有效数字。实际上,如果这是NCAA,则大多数数字都是非法的(请参阅第5节第5.b.2条)。

相反,JerseyNumber是它自己的类型。它有自己的法律业务(从技术上讲,它有自己的代数)。

对于JerseyNumber而言,最明智的原始类型是String,因为您希望能够将00与0区分开。我可能会以这种方式实现它,这将为您提供Equatable,Hashable,CustomStringConvertible和更方便的Codable:

struct JerseyNumber: Hashable {
    private var string: String

    static let legalNumbers = ["0", "1", "2", "3", "4", "5", "00", "10", "11", "12", "13", "14", "15", "20", "21", "22", "23", "24", "25", "30", "31", "32", "33", "34", "35", "40", "41", "42", "43", "44", "45", "50", "51", "52", "53", "54", "55"]

    init?(_ string: String) {
        guard JerseyNumber.legalNumbers.contains(string) else { return nil }
        self.string = string
    }
}

extension JerseyNumber: CustomStringConvertible {
    var description: String { string }
}

extension JerseyNumber: Codable {
    init(from decoder: Decoder) throws {
        let container = try decoder.singleValueContainer()
        let value = try container.decode(String.self)
        guard let number = JerseyNumber(value) else {
            throw DecodingError.dataCorruptedError(in: container,
                                                   debugDescription: "Could not decode JerseyNumber: \(value)")
        }
        self = number
    }

    func encode(to encoder: Encoder) throws {
        var container = encoder.singleValueContainer()
        try container.encode(string)
    }
}

显然,如果这不是NCAA,或者您想要其他数字规则,则可以重新init执行以强制执行该规则,也可以不以任何对您的问题有意义的方式强制执行。例如,您可以解析字符串,而不是包含大量合法值。这只是一个例子。但基本要点是为此使用自定义类型,而不是UInt。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使一个既可以选择又可以使属性变为只读的泛型类型?

我可以构造一个既可以使用值又可以引用特征的结构吗?

如何创建一个既可以用作后续意图又可以直接在Dialog Flow中触发的主要意图的意图?

声明一个既可以等待*又可以异步运行而无需等待其完成的异步方法?

R中是否有一个既可以bind_rows()又可以bind_cols()的函数?

如何将一个库发布到npm,既可以用于导入又可以用于需求?

如何在SwiftUI中创建一个既可以用作安全字段(带有眼睛图标)又可以用作普通TextField的自定义TextInput

java,Generics-如何对类型为T的类进行参数化,该类T既可以扩展又可以实现

单个文件系统对象如何既可以是符号链接又可以是目录?

构建一个既可以控制也可以不受控制的React组件

WHERE 包含某些值,CASE 包含附加值

如何表示既可以是数字的又可以是模拟的传感器和执行器?

如何为包含一些固定值并可能具有其他附加值的数组字符串创建数组 json 模式

原子既可以是谓词又可以是运算符?

例如Windows许可证既可以在硬件上运行又可以在VM中运行?

东西既可以是云又可以是“本地”吗?

在MIT方案/球拍中,值既可以是运算符又可以是操作数?即(lambda(y)(yy))

应该如何编写Python文件,使其既可以是模块又可以是具有命令行选项和管道功能的脚本?

创建一个空的dask数据框并向其附加值

创建Java类可以包含任何类型的一个变量

使用反应式扩展我如何创建一个动态列表,其中包含可以过期的值

可以編輯附加值嗎?

用docstring记录Python函数,该docstring既可以原始格式读取,又可以产生良好的sphinx输出

使用.htaccess既可以处理不存在的路径,又可以将http转换为https

如何编写一个既可继承又可泛型的类?

当我附加一个值时,整个数组正在更改为附加值

如何创建一个可以包含多个函数而不是单个函数的fmap?

如何创建一个Spring Data JPA可以解析以包含nulls_first排序的URL?

数组值仅返回第一个字符和附加值