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

时间:2017-12-21 20:15:26

标签: 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!
}

type2转换为type1的最佳方式是什么?我从API返回并使用可编码解析它,但有两个不同的结构,我需要得到一个结构。数据是相同的,它只是在类型方面有不同的映射。一些结构具有更多信息而其他结构具有更少信息。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

你不能施放两个不相关的结构。您可以做的是为它们中的两个定义一个公共协议,并在不关心它是哪个底层对象的地方使用它们。

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!

}

然后,在您目前使用type1而不是type2的任何地方,让该功能只接受CommonProtocol,您可以使用其中任何一个。

请注意,虽然您的两种类型都有variable2,但其中一种是Double?而另一种是String?。我可以通过几种不同的方式来解决这个问题。我把它从协议中删除了。

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