在枚举中传递数组

时间:2014-11-25 16:45:37

标签: swift

我正在尝试将Enum传递给一个闭包,这与Apple在其网页上的guided tour上所做的不同。

这完全没问题:

public enum CreateProductResult<A:Product, B:NSError> {
    case product(A)
    case error(B)
}

public typealias CreateProductHandler = (CreateProductResult <Product, NSError>) -> ()

但这不会编译:

public enum FetchProductResult<A:[Product], B:NSError> {
    case product(A)
    case error(B)
}

public typealias FetchProductsHandler = (FetchProductResult <[Product], NSError>) -> ()

错误:

error: expected a type name or protocol composition restricting 'A'

当我尝试传递Array时为什么会出错?我是否真的必须围绕它编写一个包装类才能将其用作枚举?

2 个答案:

答案 0 :(得分:2)

数组是结构体,swift不支持结构体的继承,因此指定必须从数组继承的类型是没有意义的。

您可以通过让product案例期望数组来解决这个问题,并在通用约束中指定Product

public enum FetchProductResult<A:Product, B:NSError> {
    case product([A])
    case error(B)
}

public typealias FetchProductsHandler = (FetchProductResult <Product, NSError>) -> ()

请注意,如果数组是引用类型,您的代码将起作用 - 只是为了证明,如果您创建了一个ReferenceArray类(我为其提供了一个空实现),则此代码可以正常工作:

public class ReferenceArray<T> {}

public enum FetchProductResult<A:ReferenceArray<Product>, B:NSError> {
    case product(A)
    case error(B)
}

public typealias FetchProductsHandler = (FetchProductResult <ReferenceArray<Product>, NSError>) -> ()

但是等等,数组的引用类型版本已经存在:NSArray - 如果您愿意,可以使用它,但当然它不支持泛型:

public enum FetchProductResult<A:NSArray, B:NSError> {
    case product(A)
    case error(B)
}

public typealias FetchProductsHandler = (FetchProductResult <NSArray, NSError>) -> ()

所以实际上并不是解决您特定问题的优雅方案。

答案 1 :(得分:0)

这不应该被声明为泛型,因为你不能传递一个结构(这是一个``Array```在Swift中)。相反,你必须更具体:

public enum FetchProductResult{
    case product([Product])
    case error(NSError)
}

public typealias FetchProductsHandler = (FetchProductResult) -> ()