在swift中隐式转换两个“相同”类型

时间:2016-12-07 19:17:19

标签: swift types casting

如果我有两种类型

struct PersonFromLibraryA {
  let name: String
  let age: Int
}

struct PersonFromLibraryB {
  let name: String
  let age: Int
}

有没有办法隐式地将A传递给期望B的方法?

func doSomething(withPerson person: PersonFromLibraryA) { 
    ...
}

let person = PersonFromLibraryB(name: "Alice", age: 42)

doSomething(withPerson: person))

我希望这是类型安全的,即如果A或B以任何方式分散 ,这不应该编译。

我有大约20个左右的这种情况(我在图书馆的抽象层之间进行映射),并且厌倦了使用样板映射方法填充文件!

我怀疑我已经知道这个问题的答案了,但我想我会在这里问它只是为了确定!

2 个答案:

答案 0 :(得分:0)

同意rmaddy,解决这种w / type-saftey的一种方法是协议(没有类型安全,你可以用unsafeBitCast做,但请不要这样做)。然而,这会引发一个警告标志,如果你有许多相同但层次不同的类型,你可能过度抽象了某些东西(或者更可能是沿着错误的轴抽象)。

答案 1 :(得分:0)

我相信你应该认为OOP是Swift是一种OOP语言。将两者都改为班级。通常,您只需将struct更改为class即可。然后创建一个新类。

class PersonFromLibrary {
  let name: String
  let age: Int
}

现在设置其他课程:

class PersonFromLibraryA: PersonFromLibrary {
}

class PersonFromLibraryB: PersonFromLibrary {
}

现在,不要使用PersonFromLibraryA作为参数类型,而是使用PersonFromLibrary。现在,您可以将所有PersonFromLibraryA类型的内容传递为PersonFromLibrary。这里唯一的限制是,如果您为任何PersonFromLibraryA级别类添加任何唯一品质,则必须将其强制转换回PersonFromLibraryA或其相应的类才能使用其唯一属性。