您可以快速执行打字别名吗

Cod*_*per 3 types swift

我试图强制执行一个简单的类型,但该类型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,但这与我想要的非常接近。

mat*_*att 5

请注意,在雨燕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在这两种情况下“免费”。