【问题标题】:implicitly convert between two 'identical' types in swift快速在两个“相同”类型之间进行隐式转换
【发布时间】: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 - 如果您有许多相同但层之间不同的类型,您能否在评论中添加“您可能过度抽象某些东西(或更可能:沿错误轴抽象)”作为答案,我可以接受它:)

标签: swift types casting


【解决方案1】:

同意 rmaddy 的观点,即使用类型安全解决此问题的一种方法是协议(没有类型安全,您可以使用 unsafeBitCast 来解决,但请不要这样做)。但是,这会引发一个警告标志,如果您有许多相同但层之间不同的类型,您可能过度抽象了某些东西(或者更有可能:沿错误的轴抽象)。

【讨论】:

    【解决方案2】:

    我相信您应该将 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 或其对应的类才能使用其独特的属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-18
      • 1970-01-01
      • 2019-02-16
      • 2015-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-08
      相关资源
      最近更新 更多