gpt4 book ai didi

swift - 你能在 swift 中强制使用类型别名吗

转载 作者:搜寻专家 更新时间:2023-10-31 21:52:07 32 4
gpt4 key购买 nike

我正在尝试强制执行由 Int 支持的简单类型,不会与其他 Int 混淆。

假设您有以下类型别名:

typealias EnemyId = Int
typealias WeaponId = Int

我希望以下代码有编译错误:

var enemy: EnemyId = EnemyId("1")
enemy = WeaponId("1") // this should fail

我想失败的那一行,应该会失败,因为这两种类型(EnemyId 和 WeaponId)是不同的类型。

实现这一目标的最好、最简洁的方法是什么?

更新

查看答案和评论后,我想添加我使用枚举的想法:

enum Enemy {
case id(Int)
var id: Int {
switch self {
case .id(let i):
return i
}
}
}
let enemy = Enemy.id(1)
print("enemy: \(enemy.id)")

目前 Mattt 的答案更短,更符合您对 Swift 的期望。

更新#2

我还没有访问 swift 4.1 的权限,所以我必须执行以下操作:

  struct EnemyId : Hashable {
private let value: Int

init(_ value: Int) {
self.value = value
}

init?(_ string:String) {
guard let value = Int(string) else { return nil }
self.init(value)
}

static func ==(_ lhs: EnemyId, _ rhs: EnemyId) -> Bool {
return lhs.value == rhs.value
}

var hashValue: Int {
return value.hashValue
}
}

然而结果是我的解析增加了几百毫秒,因此我不得不恢复到类型别名,但它非常接近我想要的。

最佳答案

请注意,在 Swift 4.1 中,像 Rob 和 Cristik 这样的包装器结构建议编写变得微不足道,因为当您声明采用 Hashable 时,您将获得 hashValue自动合成实现== 在幕后。

因此,为了您的目的,这样写可能就足够了:

struct EnemyId: Hashable {
let value: Int
}
struct WeaponId: Hashable {
let value: Int
}

在这两种情况下,您都可以“免费”获得成员初始化器 init(value:) 加上 == 加上 hashValue

关于swift - 你能在 swift 中强制使用类型别名吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48754433/

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