Swift protocol的Declare属性表明,由于协议具有自身或关联的类型要求,因此它只能用作泛型约束

Swift protocol的Declare属性表明,由于协议具有自身或关联的类型要求,因此它只能用作泛型约束,swift,Swift,我陷入了无法找到解决办法的境地。我见过很多类似的问题,但没能解决 所以我有一个视图控制器,它显示两种类型的表视图列表 1) 销售 2) 购买 我已经决定使用相同的视图控制器 enum SalesRowType { case salesOrderBooking case salesInvoicing case salesGrossContribution } enum PurchaseRowType { case purchaseOrders case a

我陷入了无法找到解决办法的境地。我见过很多类似的问题,但没能解决

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

1) 销售
2) 购买

我已经决定使用相同的视图控制器

enum SalesRowType {
    case salesOrderBooking
    case salesInvoicing
    case salesGrossContribution
}

enum PurchaseRowType {
    case purchaseOrders
    case amended_non_amended
    case pending_grn_po
}

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

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”只能用作泛型约束,因为它具有自身或关联的类型要求


请帮我把这个修好。提前感谢

更新

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

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

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

protocol ListRowType {
    var title: String {get}
    var image: UIImage {get}
    var type: RowType  {get}
}
并完全跳过了
HomeSubItemType

子项
现在是

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
}

也许我问题的第一部分可以指导你:@J.Doe谢谢,我会检查一下out@J.Doe当声明数组
[SubItem]
时,我无法附加类型为
PurchaseRowType的项。purchaseOrders
会显示错误,例如无法将类型为“[SubItem]”的值分配给类型为“[SubItem]”的项。有什么帮助吗?为什么不
var itemList=[ListRowType]()
?@vadian我已经这样做了,但我还需要
类型
,所以我创建了
HomeSubItemType
,谢谢,但我知道J.Doe建议的这个解决方案。正如您在代码中所示,这对销售很有效,但这对购买和销售都不起作用,我得到的类型无法赋值'[SubItem]“键入”[SubItem]“是的,任何一个都可以。但它似乎是黑客。我肯定会给你+1,但如果你能提供更好的解决方案,我会接受这个答案:)
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]()