静态&使用Enum&的动态截面建模结构 - 斯威夫特4

时间:2018-03-29 13:26:38

标签: swift struct enums data-modeling sections

我有以下模型结构:

enum ProductSectionType {
    case ProductDetails
    case ProductPricing
}

enum Item {
    case Brand
    case Collection
    case Dimensions
    case SoldBy
    case Category
    case Pricing
}

struct ProductSection {
    var type: ProductSectionType
    var items: [Item]
}

问题是,枚举项中的定价实际上是一个数组。这是我从后端返回的数据:

Product(productCode: "SomeCode",
productBrand: "SomeBrand",
productCategory: "SomeCategory",
productDimensions: "SomeDimensions",
productCollection: "Some Collection",
productSoldBy: "??",
productPricing: ["X-Price = 100", "Y-Price = 200"]))

viewDidLoad我有:

sections =
[ProductSection(type: .ProductDetails,
items: [.Brand, .Collection, .Category, .Dimensions, .SoldBy]),
             ProductSection(type: .ProductPricing,
items: [.Pricing])]

UITableViewDataSource我有:

func numberOfSections(in tableView: UITableView) -> Int {
        return sections.count
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return sections[section].items.count
    }

如何将定价作为动态数组推广到viewDidLoad& UITableViewDataSource

更新

以下是我的产品型号我删除了其他字段:

struct Product {
    let productPricing: [String]
etc.......

    var dictionary: [String : Any] {
        return [
etc.......
            "Pricing": productPricing
        ]
    }
}

extension Product: DocumentSerializable {
    init?(dictionary: [String : Any]) {
        guard let productCode = dictionary["Code"] as? String,
etc......
            let productPricing = dictionary["Pricing"] as? [String]
            else { return nil }

        self.init(productCode: productCode,
etc......
                  productPricing: productPricing)
    }
}

我只在一个部分中有5个静态单元格,而我有第二个部分包含动态单元格。这是对这些数据进行建模的最佳方法?我应该放弃上面的方法吗?

1 个答案:

答案 0 :(得分:0)

创建一个结构来容纳api响应。

struct Product: Codable {
  var productCode: String
  var productCategory: String
  ...
  var productPrice: [String] // or a other struct if only x and y prices are there.
  var productPrice: PPrice
}

struct PPrice {
   var XPrice: String
   var YPrice: String
}

通过使associated value的项目枚举接受回复。

enum Item {
   case Brand(String)
   case Collection(String)
   ...
   case Pricing([String]) or Pricing(PPrice) // in case of only x and y
}

现在有部分

extension Product {
  var detailsItems: [Item] {
     return [.Brand(self.productBrand), 
             .Collection(self.productCollection),...]
  }

  var priceItems: [Item] {
      return self.productPrice.map{.Price($0)}
      or 
      return [.Price(self.productPrice.XPrice),
              .Price(self.productPrice.YPrice)]
  }
}

这是Swift枚举与关联类型的一个很好的例子,因为它们是与案例绑定的单个类型。

这也为tableView - collectionView数据源中的单个类型的单元格添加了更安全,更清晰的方法。