gpt4 book ai didi

swift - 在枚举中传递数组

转载 作者:行者123 更新时间:2023-11-28 05:32:37 26 4
gpt4 key购买 nike

我正在尝试将枚举传递给闭包,这与 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com