将具有一种类型的结构更改为另一种类型

Nev*_*ani 3 swift swift4

我有两个具有相同字段的结构。合并它们的最佳方法是什么。

struct Type1{
    var variable1:String?    
    var variable2:Double?
    var variable3:String?

    var notImporant:String?
} 

struct Type2{
    var variable1A:String?    
    var variable2A:String?
    var variable3A:String!
}
Run Code Online (Sandbox Code Playgroud)

什么是转换的最佳方式type2type1?我从 API 获得返回并使用 codable 解析它,但有两个不同的结构,我需要获取一个结构。数据是相同的,只是在类型方面映射不同。一些结构有更多的信息,而另一些则有更少的信息。

Fra*_*amp 6

只需在两个结构中创建一个复制构造函数,如下所示:

struct Type2 {
  var variable1A:String?    
  var variable2A:String?
  var variable3A:String!
  init(_ otherType: Type1) {
    variable1A = otherType.variable1
    variable2A = otherType.variable2
    variable3A = otherType.variable3
  }
}
Run Code Online (Sandbox Code Playgroud)


Con*_*nor 5

您不能强制转换两个不相关的结构。您可以做的是为它们两个定义一个通用协议,并在您不关心它是哪个底层对象的地方使用它们。

protocol CommonProtocol {
    var variable1: String? { get }
    var variable3: String? { get }
}

struct Type1: CommonProtocol {

    var variable1:String?    
    var variable2:Double?
    var variable3:String?

    var notImporant:String?
} 

struct Type2: CommonProtocol {

    var variable1A:String?    
    var variable2A:String?
    var variable3A:String!

}
Run Code Online (Sandbox Code Playgroud)

然后,无论您目前在哪个地方使用 atype1而不是 a type2,让该函数只接受 a CommonProtocol,您都可以使用。

请注意,虽然您的两种类型都有 a variable2,但其中一个是Double?while 另一个是 a String?。有几种不同的方法可以解决这个问题,我留给你。我只是把它排除在协议之外。

另一方面,将结构体 ( Type1, Type2)的名称大写是 Swift 的标准。在某些情况下,如果你不这样做,你可能会遇到问题,所以我建议你这样做。