作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将枚举传递给闭包,这与 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
时出错了?我真的必须围绕它编写一个包装类才能将其用作枚举吗?
最佳答案
数组是一种结构,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>) -> ()
所以实际上不是针对您的特定问题的优雅解决方案。
关于swift - 在枚举中传递数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27132214/
我是一名优秀的程序员,十分优秀!