我将尝试实现一个简单的类型,由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
}
}
然而,结果证明它增加了几百毫秒的解析时间,因此我不得不回到typealias,但它非常接近我想要的效果。