我正在尝试将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
时为什么会出错?我是否真的必须围绕它编写一个包装类才能将其用作枚举?
答案 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) -> ()