代码之家  ›  专栏  ›  技术社区  ›  Prashant Tukadiya

Protocol的Declare属性显示Protocol只能用作泛型约束,因为它具有自身或关联的类型要求

  •  1
  • Prashant Tukadiya  · 技术社区  · 7 年前

    我陷入了找不到解决办法的境地。看到了许多相似的问题,但无法解决。

    所以我有一个视图控制器,它显示两种类型的表视图列表

    1)销售
    2)购买

    我决定用同一个视图控制器

    enum SalesRowType {
        case salesOrderBooking
        case salesInvoicing
        case salesGrossContribution
    }
    
    enum PurchaseRowType {
        case purchaseOrders
        case amended_non_amended
        case pending_grn_po
    }
    

    // BASE PROTOCOL
     // ListRowType -> has title,image property 
    protocol HomeSubItemType:ListRowType {
        associatedtype RowType
        var type:RowType {get}
    }
    // PURCHASE ITEMS
    
    struct PurchaseSubItem: HomeSubItemType {
    
        typealias RowType = PurchaseRowType
    
        var image: UIImage
        var title: String
        var type: PurchaseRowType
    }
    // SALES ITEMS
    struct SalesSubItem : HomeSubItemType {
        var image:UIImage
        var title:String
        var type:SalesRowType
    }
    

    在我的视图控制器中,我想根据销售和购买创建数组

    if let type = type {
                switch type {
                case .purchase:
                    self.title = "Purchase"
                    self.itemList = [
                        PurchaseSubItem(image: UIImage(named: "purchase-orders")!, title: "Purchase Orders", type: .purchaseOrders),
                        PurchaseSubItem(image: UIImage(named: "amended-non")!, title: "Amended/NON-Amended-UNAutho-PO", type: .purchaseOrders),
                        PurchaseSubItem(image: UIImage(named: "purchase-pending")!, title: "Pending GRN PO", type: .purchaseOrders)]
    
                case .sales:
                    self.title = "Sales"
    
                    self.itemList =
                    [
                        SalesSubItem(image: UIImage(named: "sales-order-booking")!, title: "Sales Order Booking", type: .salesOrderBooking),
                        SalesSubItem(image: UIImage(named: "sales-invoice")!, title: "Sales Invoicing", type: .salesInvoicing),
                        SalesSubItem(image: UIImage(named: "sale-gross")!, title: "Sales Gross Contribution", type: .salesGrossContribution)]
    
                default:
                    assertionFailure("Only Purchase and sales are handle here")
                }
            }
    

    但是我不能声明数组

    var itemList  = [HomeSubItemType]() 
    //ERROR HERE
    

    协议“homesubitemtype”只能用作泛型约束,因为它具有自身或关联的类型要求

    请帮我修一下。提前谢谢

    1 回复  |  直到 7 年前
        1
  •  2
  •   Joakim Danielson    7 年前

    更新

    这是一个完全不同的解决方案,专注于解决问题,而不是使用泛型

    首先,我为枚举创建了一个协议,它是空的,因为它只是将它们分组在一起。

    protocol RowType {}
    

    两个枚举都实现了这一点,这里没有显示,我将ListRowType修改为

    protocol ListRowType {
        var title: String {get}
        var image: UIImage {get}
        var type: RowType  {get}
    }
    

    跳过 HomeSubItemType 完全。

    SubItem 现在是

    struct SubItem: ListRowType {
        var type: RowType
        var title: String
        var image: UIImage   
    }
    

    我的测试代码

    var itemList  = [ListRowType]()
    let sale = SubItem(type: SalesRowType.salesInvoicing, title: "XYZ", image: UIImage())
    itemList.append(sale)
    
    let purchase = SubItem(type: PurchaseRowType.purchaseOrders, title: "ABC", image: UIImage())
    itemList.append(purchase)
    

    这当然可以和原件一起使用 PurchaseSubItem SalesSubItem 而不是 子项目 如果愿意的话


    我用一个泛型结构替换了这两个结构

    struct SubItem<T>: HomeSubItemType {    
        typealias RowType = T
    
        var type: T
        var title: String
        var image: UIImage
    }
    

    像这样使用

    var itemList  = [SubItem<SalesRowType>]()
    var item = SubItem(type: SalesRowType.salesInvoicing, title: "XYZ", image: UIImage())
    
    itemList.append(item)
    

    因此,您需要数组,这可能是最好的,如果出于某种原因,您必须只有一个数组,然后声明它

    var itemList  = [Any]()