我试图强制执行一个简单的类型,但该类型Int不能与其他Ints 混淆。
假设您有以下类型别名:
typealias EnemyId = Int
typealias WeaponId = Int
Run Code Online (Sandbox Code Playgroud)
我希望以下发生编译器错误:
var enemy: EnemyId = EnemyId("1")
enemy = WeaponId("1") // this should fail
Run Code Online (Sandbox Code Playgroud)
我要失败的行应该失败,因为这两种类型(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)")
Run Code Online (Sandbox Code Playgroud)
当前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
}
}
Run Code Online (Sandbox Code Playgroud)
但是事实证明,这给我的解析增加了几百毫秒的时间,因此我不得不恢复为typealias,但这与我想要的非常接近。
请注意,在雨燕4.1的包装结构像罗布和Cristik所提出的建议就变得琐碎写的,因为当你宣布采用可哈希的,你就会得到自动合成实现的hashValue,并==在幕后。
因此,出于您的目的,编写以下内容可能就足够了:
struct EnemyId: Hashable {
let value: Int
}
struct WeaponId: Hashable {
let value: Int
}
Run Code Online (Sandbox Code Playgroud)
你得到的按成员初始化init(value:)加上==加hashValue在这两种情况下“免费”。
| 归档时间: |
|
| 查看次数: |
222 次 |
| 最近记录: |