如何在iOS中自己创建的模型类中使用泛型?

时间:2018-07-14 07:18:46

标签: ios swift generics

如何在自己创建的模型类中使用泛型?
我有一个FeatureListModel类,其他有FavoriteModel类。两者都存储相同的属性,唯一的区别是不同的类模型名称。

我需要在ProductDetail控制器中显示模型属性值。

我该如何使用泛型来管理这些东西?

这是我的代码(Swift 4.2):

第一个模型:FavoriteListModel

class FavoriteListModel {

    var categoryID: Int?

    var item_name: String?

    var MRP: String?

}

第二个模型:FeatureListModel

class FeatureListModel {

    var categoryID: Int?

    var item_name: String?

    var MRP: String?

}

我还有8-10个属性,但这只是我的代码中的一些内容。

控制器-ProductDetailTableViewController

class ProductDetailTableViewController : UITableViewController {

    var productDetails: FavoriteListModel!

    var productFeatureList: FeatureListModel!

   fileprivate func displayProduct() {

      if productDetails != nil {

        title = productDetails.item_name

        categoryID = productDetails.categoryID!

       }else if productFeatureList != nil {

          categoryID = productFeatureList.categoryID!

          title = productFeatureList.item_name

  }
}

在我的“产品详细信息表控制器”中,我正在访问模型对象并在屏幕上显示。 我不要if-else检查。

2 个答案:

答案 0 :(得分:1)

您正在混合泛型和协议。在您的情况下,最好使用协议。

ProductDetailTableViewController中有一个对象,它响应item_name的吸气剂(顺便说一句,请遵循 camelCased 命名约定itemName)和{ {1}}。对象的类型以及其他属性和功能的存在并不重要。

创建协议

categoryID

然后在您的类中采用该协议(您是否真的需要一个 class ?)并至少将protocol Listable { var itemName : String { get } var categoryID : Int { get } } 声明为非可选,因为您无论如何稍后都会强制解开该值。 请勿将可选内容用作不在编写初始化程序的理由

categoryID

class FavoriteListModel : Listable { ... class FeatureListModel : Listable { ... 中将两个属性声明为ProductDetailTableViewController,而不是两个属性,而不是 objective-c-ish Listable检查使用可选绑定:

nil

答案 1 :(得分:0)

您这里拥有的不是泛型的用例。例如,当您具有一个功能完全相同但可以与两种不同参数类型一起使用的函数时,将使用泛型。那就是您使用泛型的时候。

另一个概念是超类(父类或基类),当您具有具有公共属性的类,然后是具有这些属性的其他类,然后是其他不同的独特属性(在这种情况下,每个类将父类子类化)时使用课。

您在这里拥有的都不是。对于这种情况,一个好的架构只是一个模型类型(类或结构),并在视图控制器中使用两个不同的集合(数组或集合)。

您还可以创建一个收藏夹类或特色类,其中包含与您的模型关联的数组。