【发布时间】:2016-12-07 19:17:19
【问题描述】:
如果我有两种类型
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 种这种情况(我在库中的抽象层之间进行映射)并且非常厌倦使用样板映射方法填充文件!
我怀疑我已经知道这个问题的答案,但我想我会在这里问它以确保确定!
【问题讨论】:
-
为什么不 one 结构具有
fromLibrary属性(枚举)或两个结构都符合并用作方法参数中的类型的协议。 -
同意 rmaddy 的观点,即使用类型安全解决此问题的一种方法是协议(没有类型安全,您可以使用 unsafeBitCast 来解决此问题,但请不要这样做)。但是,这会引发一个警告标志,如果您有许多相同但层之间不同的类型,您可能过度抽象了某些东西(或者更有可能:沿错误的轴抽象)。
-
是的,我写的越多,我认为我的层设计的越多——我试图避免我的公共类(结构)实现一个仅在内部使用的协议。所以我在一组内部类上实现了协议,所以它没有暴露。我开始认为我应该接受它将公开,并将我的代码库减半!
-
嘿@RobNapier - 如果您有许多相同但层之间不同的类型,您能否在评论中添加“您可能过度抽象某些东西(或更可能:沿错误轴抽象)”作为答案,我可以接受它:)