如果我有两种类型
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个左右的这种情况(我在图书馆的抽象层之间进行映射),并且厌倦了使用样板映射方法填充文件!
我怀疑我已经知道这个问题的答案了,但我想我会在这里问它只是为了确定!
答案 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
或其相应的类才能使用其唯一属性。