代码之家  ›  专栏  ›  技术社区  ›  Vjardel

按目标使用不同模式映射Apollo的graphql对象

  •  1
  • Vjardel  · 技术社区  · 7 年前

    我有一个有多个目标的项目。

    我已经实现了Apollo,用graphql请求数据库。目标具有稍微相同的模式,但有一些差异:+1或2个字段取决于目标。

    我可以成功地构建我的应用程序,因为我已经将构建阶段更改为仅构建*common.graphql和*targetname.graphql

    因此,当目标A的年率碎片如下:

    fragment AnnuaireFragment on Directory {
        id
        test
    }
    

    目标B的年率是这样的:

    fragment AnnuaireFragment on Directory {
        id
    }
    

    一切都可以建立,碎片是分开的。

    我希望当我使用翻译器时,我也可以建立。两个目标只能使用一个翻译器吗?

    static func translateFromAnnuaireNode(annuaireNode: GetAnnuaireFromSearchQuery.Data.Directory.Edge.Node) -> ContactModel {
                let contactModel = ContactModel()
                contactModel._id = annuaireNode.id
                // Here that doesn't build for target B because annuaireNode.test doesn't exist
                contactModel.test = annuaireNode.test
    
                return contactModel
    }
    

    如何成功地为目标A和B构建应用程序?

    1 回复  |  直到 7 年前
        1
  •  1
  •   markvasiv    7 年前

    在为目标B构建时,编译器不知道存在不同的类定义,即 getannuairefromsearchquery.data.directory.edge.node ,它特定于目标A。这意味着此错误是编译时错误,唯一可能的解决方法是在编译时对其进行寻址。

    我能想到的可能的解决方案是为不同的目标使用不同的编译条件。

    设置如下:

    1. 在其中一个目标上的“构建设置”下,请放置 target_a 和另一个位置下 target_b

    <开始=“2”>
  • 使用 if 在编译期间区分目标

    static func translatefrommanuairenode(annuairenode:getannuairefromsearchquery.data.directory.edge.node)->contactModel{
    让contactModel=contactModel())
    contactModel.\u id=annuairenode.id
    
    
    如果目标是
    //此处的代码仅在生成目标A时编译
    contactModel.test=年度节点.test
    第二节
    
    返回联系人模型
    }
    
  • 这是针对目标A的,这意味着这个错误是编译时错误,唯一可能的解决方法是在编译时对其进行处理。

    我能想到的可能的解决方案是为不同的目标使用不同的编译条件。

    设置如下:

    1. 在目标位置的“生成设置”下 TARGET_A 在另一个地方 TARGET_B

    enter image description here

    1. 使用 #if 在编译期间区分目标

      static func translateFromAnnuaireNode(annuaireNode: GetAnnuaireFromSearchQuery.Data.Directory.Edge.Node) -> ContactModel {
          let contactModel = ContactModel()
          contactModel._id = annuaireNode.id
      
      
          #if TARGET_A
          //The code here will only be compiled when building target A
          contactModel.test = annuaireNode.test
          #endif
      
          return contactModel
      }